文章出處

      對我的文章和培訓課程感興趣的可以加我微信16230091進行關注。

——————————————————————————————————

      今天聊聊我沉淀比較久的一門技術,設計模式。這里是第一篇,算是概論,講一下我這些年來學習設計模式的心路歷程。

      (一)

     設計模式和數據結構,在日常開發工作中,無論是App還是后端Java開發,都非常實用,是必須要牢牢掌握的兩門基本功。

     我不是科班出身,所以我第一次接觸設計模式,是在05年,也就是工作一年之后,在書店看到講設計模式的一本書,就買回來從頭做了一遍,前幾個模式還比較簡單,越到后面越看著費勁。

     書看了一遍遍,但是在項目中很少使用到,所以能沉淀下來的也就單例、簡單工廠、模版方法模式而已。這是第1個階段:初識。

     后來經常在面試中被問的張口結舌,很多模式明明看過,卻當場畫不出來UML圖,以及它背后的深刻思想。于是我開始死記硬背,把23個設計模式的UML圖和代碼實現,如同背誦乘法口訣一樣,牢牢的記在心里。每次面試前一天,躺床上閉上眼睛把設計模式從頭在腦子里過一遍,遇到哪個記不清了,就拿出書來看看,然后閉上眼睛繼續過,因為是躺床上閉著眼睛,所以經常就睡著了,醒了繼續,然后就這么全都背下來了。這是第2個階段:死記硬背。

     后來就開始寫博客了。十年來我寫了五六百篇文章。寫博客分為三層境界,第一層是自己能看懂,幾年后也能看懂,這是讀書筆記;第二層境界是讓讀者也能看懂,這是教學貼;第三層是你能講一些自己獨特的心得體會,這是老司機。我從一開始寫筆記給自己看,到讓更多的人也能看懂,為此參考了大量的技術文章和數據。08年設計模式比較流行的是呂震宇和李會軍的文章系列,此外,還有一本書不得不提,《Java與設計模式》,對我的影響都是很大的。這是第3步,把自己的理解講給別人聽。

 

     (二)

     世界上最長的路,是什么路?

     {7A52F6CD-F768-941B-405F-A122641EC3DC}

     技術做的雜了,就會發現,原來技術也是講套路的。十多年編程,我基本都從事UI的工作,從ASP.NET和Win Form,到WPF、Silverlight,從Windows Phone7到Android、iOS,經歷了這么多系統,我深深的感受到這些系統在很多地方的實現思想是一樣的,都用了相同的設計模式。

     比如說頁面內控件之間是怎么互相通信的,它們都是借助于一個中介者作為載體,Android中就是Activity,iOS中就是ViewController。我們平常很少去自定義一個中介者模式,但我們每天都在中介者模式下進行工作。

     {5E9CC89A-2756-2EE7-A84D-D78A09437E28}

     再比如說點擊某個區域,系統是怎么響應你的點擊操作的。它會一層層往上或往下找,看這塊區域內哪個框架能響應你的點擊操作,這是典型的職責鏈模式。

     clip_image006

     比如說所有系統都有一棵控件樹,樹上存放的要么是一個具體的控件,要么是一個控件集合。這就是組合模式。想要遍歷這棵控件樹,就要用到遞歸算法。

     clip_image008

     再比如說,在XCode、Android Studio以及微軟的Visual Stuido中,有各種各樣的菜單和快捷鍵,點擊后都會觸發一個行為。這些都是基于命令模式實現的。

     clip_image009

     再進一步,程序員喜歡使用ctrl+z回退修改前的歷史,這樣的實現既可以用命令模式實現,也可以用備忘錄模式來實現,一共有3種設計方案,取決于后退操作是否可逆,以及你在時間和空間上的取舍。

     {F569D423-5818-B416-718A-04172D7ADE77}

 

     (三)

     轉眼已過十年,曾經我也遇到過技術瓶頸。于是我轉而去研究烘焙、烹飪、咖啡,隨著對這些技藝的掌握,我也發現這其中就蘊含著設計模式的思想。

     比如說,炒菜,就是裝飾器模式。每次給這盤菜加鹽、加糖、加雞精,都是一種裝飾。

     clip_image013

     再比如說,烘焙分四大類,蛋糕、面包、餅干、撻酥。不管怎么分,都離不開面粉(低筋、高筋)、奶油、黃油、蛋黃、白砂糖這些主要原料,只是搭配不同、比例不同、火候不同而已,這其實就是模版方法模式。當然,這么分類設計,對于也會烘焙的程序員而言,有點粗。面包和餅干的配料和做法還是有很大不同的。

     生活中的設計模式比比皆是,這就需要我們去熱愛生活、接觸生活,才能感受到。這是第4步:從生活中尋找設計模式的影子。

     正如設計模式的啟蒙之作《建筑的永恒之道》所說,只有踏上了永恒之道(The Timeless Way),才會生機勃勃(alive)。

 

——————放松一下——————————————————

 

     看過《倚天屠龍記》的,都知道這樣一個片段:

     金花婆婆:“謝三哥,我這輩子從來沒說過謝字。”

 

——————放松結束——————————————————

 

     (四)

     看過上面那個笑話,我們可以輕松回憶起張三豐的太極功夫。還記得他是怎么教張無忌這趟功夫的么?

     學會后,要全都忘記——無招勝有招!

     對設計模式的學習,最高的境界就是無招勝有招。要把之前刻在腦子里的23個設計模式都忘記。只留下設計模式6大原則就夠了:

  • 單一職責原則

     一個類只做一類事情。為此,我們應該多用類的引用,而不是類的繼承。

  • 開閉原則

     最重要的設計原則。Activity和ViewController動輒幾千行代碼,又難讀懂又難修改,就是因為沒有遵守這個原則。最著名的例子,就是把switch語句改為簡單工廠。

  • 里氏替換原則

     其實就是多態。

  • 依賴倒置原則

     依賴于抽象編程。所以你看到所有的設計模式都有抽象類和接口的存在。

  • 接口隔離原則。也就是看人下菜碟。

     有多大胃口吃幾碗飯。寬窄接口就是基于此,備忘錄模式也是基于此。

  • 迪米特法則。

     也就是不要和陌生人說話。一個類不要引用太多的類。

 

     23個設計模式就是基于這6個設計原則而衍化出來的。所以忘記那些具體的設計模式,給自己的大腦多釋放些內存,用來存放更有用的知識。

     接下來的公眾號文章,我會對上面的內容進行展開,逐一介紹每一個設計原則、每一個設計模式,敬請期待

——————————————————————————————————

 

   最后是一波廣告,我現在每天晚上8點在騰訊課堂做Android和iOS技術直播,涉及以下領域:

  • Android和iOS組件化拆分
  • App性能優化
  • App瘦身
  • Android插件化
  • Android和iOS熱修復
  • iOS內存管理
  • iOS Runtime
  • 設計模式
  • RxJava
  • 注解編程
  • AOP
  • ReactNative
  • Swift
  • App自動化測試
  • 面試算法題

     

     對我的文章和培訓課程感興趣的同學,可以加我微信16230091進行關注。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()