對我的文章和培訓課程感興趣的可以加我微信16230091進行關注。
——————————————————————————————————
今天聊聊我沉淀比較久的一門技術,設計模式。這里是第一篇,算是概論,講一下我這些年來學習設計模式的心路歷程。
(一)
設計模式和數據結構,在日常開發工作中,無論是App還是后端Java開發,都非常實用,是必須要牢牢掌握的兩門基本功。
我不是科班出身,所以我第一次接觸設計模式,是在05年,也就是工作一年之后,在書店看到講設計模式的一本書,就買回來從頭做了一遍,前幾個模式還比較簡單,越到后面越看著費勁。
書看了一遍遍,但是在項目中很少使用到,所以能沉淀下來的也就單例、簡單工廠、模版方法模式而已。這是第1個階段:初識。
后來經常在面試中被問的張口結舌,很多模式明明看過,卻當場畫不出來UML圖,以及它背后的深刻思想。于是我開始死記硬背,把23個設計模式的UML圖和代碼實現,如同背誦乘法口訣一樣,牢牢的記在心里。每次面試前一天,躺床上閉上眼睛把設計模式從頭在腦子里過一遍,遇到哪個記不清了,就拿出書來看看,然后閉上眼睛繼續過,因為是躺床上閉著眼睛,所以經常就睡著了,醒了繼續,然后就這么全都背下來了。這是第2個階段:死記硬背。
后來就開始寫博客了。十年來我寫了五六百篇文章。寫博客分為三層境界,第一層是自己能看懂,幾年后也能看懂,這是讀書筆記;第二層境界是讓讀者也能看懂,這是教學貼;第三層是你能講一些自己獨特的心得體會,這是老司機。我從一開始寫筆記給自己看,到讓更多的人也能看懂,為此參考了大量的技術文章和數據。08年設計模式比較流行的是呂震宇和李會軍的文章系列,此外,還有一本書不得不提,《Java與設計模式》,對我的影響都是很大的。這是第3步,把自己的理解講給別人聽。
(二)
世界上最長的路,是什么路?
技術做的雜了,就會發現,原來技術也是講套路的。十多年編程,我基本都從事UI的工作,從ASP.NET和Win Form,到WPF、Silverlight,從Windows Phone7到Android、iOS,經歷了這么多系統,我深深的感受到這些系統在很多地方的實現思想是一樣的,都用了相同的設計模式。
比如說頁面內控件之間是怎么互相通信的,它們都是借助于一個中介者作為載體,Android中就是Activity,iOS中就是ViewController。我們平常很少去自定義一個中介者模式,但我們每天都在中介者模式下進行工作。
再比如說點擊某個區域,系統是怎么響應你的點擊操作的。它會一層層往上或往下找,看這塊區域內哪個框架能響應你的點擊操作,這是典型的職責鏈模式。
比如說所有系統都有一棵控件樹,樹上存放的要么是一個具體的控件,要么是一個控件集合。這就是組合模式。想要遍歷這棵控件樹,就要用到遞歸算法。
再比如說,在XCode、Android Studio以及微軟的Visual Stuido中,有各種各樣的菜單和快捷鍵,點擊后都會觸發一個行為。這些都是基于命令模式實現的。
再進一步,程序員喜歡使用ctrl+z回退修改前的歷史,這樣的實現既可以用命令模式實現,也可以用備忘錄模式來實現,一共有3種設計方案,取決于后退操作是否可逆,以及你在時間和空間上的取舍。
(三)
轉眼已過十年,曾經我也遇到過技術瓶頸。于是我轉而去研究烘焙、烹飪、咖啡,隨著對這些技藝的掌握,我也發現這其中就蘊含著設計模式的思想。
比如說,炒菜,就是裝飾器模式。每次給這盤菜加鹽、加糖、加雞精,都是一種裝飾。
再比如說,烘焙分四大類,蛋糕、面包、餅干、撻酥。不管怎么分,都離不開面粉(低筋、高筋)、奶油、黃油、蛋黃、白砂糖這些主要原料,只是搭配不同、比例不同、火候不同而已,這其實就是模版方法模式。當然,這么分類設計,對于也會烘焙的程序員而言,有點粗。面包和餅干的配料和做法還是有很大不同的。
生活中的設計模式比比皆是,這就需要我們去熱愛生活、接觸生活,才能感受到。這是第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進行關注。
文章列表