對於程式設計師來說,設計模式並不新鮮。網上、書店可以找到各種設計模式的資料。很多的公司招聘技術人員都把它作為乙個衡量標準。自己最近閱讀了n本設計模式相關的書籍、也查詢了一些網上的資料,在與同事的交流中,體會較深。打算寫一系列的部落格來分享自己的技術體會和心得。
本系列部落格的重心:
學習設計模式的目的,是為了更好的設計系統。系統之所以需要設計,是因為系統要慢慢變化,有需求變更,有產品公升級,系統慢慢變得大了,維護的人員多了,就需要各種規則約束。那麼如何去應對這種大、人多、業務複雜、變化多樣的系統呢?答案就是更好的設計。那麼,該如何設計系統呢?有沒有一些指導?——大難就是設計原則。我們在設計系統時候,都是以設計原則為指導的。你知道設計模式,不知道設計原則,白搭。但是設計原則過於抽象,可以通過學習設計模式來理解設計原則。
我們在做系統設計時候,會在設計過程中遇到各種各樣的問題。有些問題久而久之,遇到的多了,就形成了一些固定的解決思路,而這些解決思路,就是設計模式。如果用這一條線來理解設計模式,一點兒都不難。即:設計過程 -> 遇到了問題 -> 總結典型問題 -> 總結解決辦法 -> 歸納出23種設計模式。
因此,設計模式一般包括模式名稱、問題、目的、解決方案、效果等組成要素,其中關鍵要素是模式名稱、問題、解決方案和效果。問題:在哪種場合和問題環境下使用這個模式。解決方案:包括uml類圖和核心**描述。效果:該模式的優缺點及需要權衡的問題。以下在分析23個設計模式時也會按照這個流程來全面的分析每個設計模式。
設計模式是面對乙個需求,或模擬乙個需求,反覆推翻,反覆實踐後的結果,在這個過程中,會對他理解的越來越深刻。
少說多用。「如果想體驗一下運用模式的感覺,那麼最好的方法就是運用它們」
學習設計模式的四重境界:
第一階段:手中無劍,心中無劍
初步掌握一門物件導向程式設計語言,了解了類、物件、介面等概念。聽別人說到「設計模式」感覺特別高大上,自己不太懂,也用不太起來。
第二階段:手中有劍,心中無劍
既然不太懂,那就學唄。四人幫經典23式開始一招一招比劃。但此時手中雖有了重劍,卻不太能舞起來。如果說某人第一次看《設計模式》,就看得通透的話,那我真是佩服得五體投地。
主要原因是,剛開始學習設計模式的人,開發經驗一般相對較少,此時我們還缺乏實際經歷的應用場景去做參考,看著書中的例子很難感同身受,比如我們看到「封裝xx變化性」之類的描述很難引起共鳴。而且很有可能模式的描述和場景壓根就不太明白。
但是沒關係,此時我們也能像模像樣喊出幾個招式了,也基本有個感性認識,雖然實際工作中還不太有感覺。
第三階段:手中有劍,心中有劍
隨著自己的學習和開發經歷的豐富,你已經對設計模式有一定理解了。在閱讀開源**,或者身邊高手的**時,你經常可以發現可以對應於某模式,因為類命名會出現設計模式中的術語,factory, builder,strategy等。你逐漸明白了某個模式用在某個地方能起到什麼作用,你經常會有一種」wow」的趕腳。
這時你在程式設計過程中,能夠照貓畫虎的用設計模式了。而且你開始學習物件導向設計原則,比如solid原則也有了一定的理解。你跟別人討論時,可以大聲地說:讓我們使用乙個xx模式來支援更好的擴充套件性吧。你時不時會回頭去《設計模式》,除了能夠提供參考,此時你會有一些新的體會了。
第四階段:手中無劍,心中有劍
你已經有設計和架構的概念了,這時你已經開始面對乙個幾萬行甚至幾十萬行的專案,有一天你發現**已經很難快速響應需求變化了,又沒辦法推倒重來(雖然推倒重來是碼農最愛),所以來重構吧,重構的過程中,乙個個設計模式把**維護中的乙個個痛點逐個擊破,你對**的「smell」有了更深刻的理解,你開始對copy-paste**深惡痛絕,你發現原來重構和設計模式竟然是孿生兄弟。
你開始明白乙個長期維護和演化的專案,設計如此之重要。你不自覺地就會主動去翻《重構》、《浮現式設計》、《領域驅動設計》、bob大叔的《敏捷軟體開發》、《企業應用架構模式》等等,雖然你之前可能看過,但此時你看他們的心境和底蘊已經不一樣了,你會發現這幫傢伙確實很會總結。
最終,你回本溯源,你還是拿起了當初那本《設計模式》,你終於深深地體會到了裡面閃爍的智慧型,「面向介面程式設計」,「組合優先繼承」,多麼樸素的文字,或許很多人都能說出來,但是你確定你現在的理解更加深刻了。
你會發現,此時你手中已經無劍了,你不會想著什麼模式列表了,不會想著某個模式重要了。進行乙個複雜設計時,不自覺地就從軟體開發的終極目標「高內聚低耦合」出發,「面向介面程式設計」,「組合優先繼承」,「建立與使用分離」等認知成為體液反應,結合需求場景,每定義下乙個類都有「開放封閉」等各種物件導向設計原則護體,隨著專案演進,你能敏銳地嗅到各種**smell,知道如何考慮現有資源去減少該死的技術債,隨時進行著重構。
感覺自己到了第三階段了。還有很長的路要走。
每乙個設計模式都為某一類可重複的設計問題提供了一套解決方案。根據他們的用途,設計模式可分為建立型、結構型和行為型模式3種。其中,建立型模式主要用於描述如何建立物件,結構型模式主要用於描述如何實現類和物件的組合,行為型模式主要用於描述類和物件怎麼互動以及怎麼分配職責。此外,根據某個模式到底是處理類之間的關係還是主要用於處理物件之間的關係,設計模式又可以分為類模式和物件模式。
前言1. 單一職責原則
2. 開閉原則
3. 黎克特制替換原則
4. 依賴倒置原則
5. 介面隔離原則
6. 迪公尺特法則
7. 合成復用原則
1. 單例模式
2. 工廠方法模式(包括:簡單工廠模式)
3. 抽象工廠模式
4. 原型模式
5. 建造者模式
1. 介面卡模式
2. 橋接模式
3. 組合模式
4. 裝飾模式
5. 外觀模式
6. 享元模式
7. **模式
1. 職責鏈模式
2. 命令模式
3. 直譯器模式
4. 迭代器模式
5. 中介者模式
6. 備忘錄模式
7. 觀察者模式
8. 狀態模式
9. 策略模式
10. 模板方法模式
11. 訪問者模式總結
技術成長之路,急不得,要多去積累相關的經驗,多做推敲和沉澱總結,凡偉大皆始於細微,問題是有人持續去做,有人很快就放棄了。
這個世界上可以掙錢的行業有很多,如果不是喜愛程式設計,熱愛程式設計,恐怕終不會耐得住寂寞,成為自己所在行業的頂端的程式設計師。所以,請愛上程式設計,愛上編碼的感覺.如果可以通過自己的技術來改變人們的生活,豈不是人生中最美好的事情。
設計模式概論
1.觀察者模式 讓你的物件知悉現狀 是jdk用的最多的模式之一。它可以幫助你的物件知悉現況,不會錯過該物件感興趣的事。物件甚至在執行時可以決定是否要繼續被通知。有了觀察者,你會訊息靈通。2.裝飾者模式 裝飾物件 如何使用物件組合的方式,做到在執行時裝飾類。3.工廠模式 烘烤oo的精華 例項化這個活動...
設計模式 概論
此篇文章為 設計模式 劉偉 的第一章讀書筆記 設計模式是從建築業的模式 pattern 引申而來。建築業的模式 pattern 其定義是在特定環境下人們解決某類重複出現的問題的一套成功或者有效的解決方案。gof將模式 pattern 的概念引入是軟體工程界,並將設計模式定義為 是在特定環境下為解決某...
Python設計模式概論
設計模式是前輩們對開發經驗的總結,是解決特定問題的一系列套路,它不是語法規定,而是一套用來提高 可復用性 可維護性 可讀性 穩健性以及安全性的解決方案。三類 1 建立型模式 單例 工廠 抽象工廠 建造者 原型 2 結構型型模式 介面卡 橋接 裝飾器 組合 外觀 享元 3 行為型模式 模板方法 命令 ...