最近在整理程序設計原則,但是只是憑自己的經驗簡單描述了一下,顯然不是很規范。設計的原則有單一職責、接口隔離、開放封閉原則等,從這些原則中衍生出24中設計模式。他說完這些我隱約是有些印象的,可能是知識不成體系,所有很容易忘記。而且口語化的表達讓人感覺不專業。趁著今天有時間,做一個記錄。
“開發一個滿足規范的軟件就跟走在水面上一樣,除非是結了冰才行(或者需求凍結不變了)”——Edward V. Berard。
我們都清楚,軟件開發的規格要求并不是一成不變的。你開發的軟件隨時都可能會發生變化。今天這個軟件的確是在履行它的職責。但是這樣就夠了嗎?你設計的軟件能夠擁抱變化嗎?
好的面向對象的設計才是關鍵。
如果你是這么想的,那么請你問自己幾個問題。
- 你的代碼是可重用的嗎?
- 如果需求改變了,是否很容易能修改完成?
- 能否在不修改代碼的前提下進行擴展?
別擔心。并不是你一個人會面臨這些問題。我們會一塊學習如何能讓我們的軟件在面對改變時能更具靈活性。
這個問題已經有不少人研究過了,他們得出的結論是OOD原則。
下面的文章從設計模式概述到設計原則,再到具體的設計模式逐步遞進。
基礎知識
設計模式概述
從招式與內功談起——設計模式概述(一):設計模式從何而來?
從招式與內功談起——設計模式概述(二):設計模式是什么?
從招式與內功談起——設計模式概述(三):設計模式有什么用?附:個人觀點
面向對象設計原則
面向對象設計原則概述
面向對象設計原則之單一職責原則
單一職責原則(Single Responsibility Principle, SRP):一個類只負責一個功能領域中的相應職責,或者可以定義為:就一個類而言,應該只有一個引起它變化的原因。
面向對象設計原則之開閉原則
開閉原則(Open-Closed Principle, OCP):一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展。
面向對象設計原則之里氏代換原則
里氏代換原則(Liskov Substitution Principle, LSP):所有引用基類(父類)的地方必須能透明地使用其子類的對象。
面向對象設計原則之依賴倒轉原則
依賴倒轉原則(Dependency Inversion Principle, DIP):抽象不應該依賴于細節,細節應當依賴于抽象。換言之,要針對接口編程,而不是針對實現編程。
面向對象設計原則之接口隔離原則
接口隔離原則(Interface Segregation Principle, ISP):使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴那些它不需要的接口。
面向對象設計原則之合成復用原則
合成復用原則(Composite Reuse Principle, CRP):盡量使用對象組合,而不是繼承來達到復用的目的。
面向對象設計原則之迪米特法則
迪米特法則(Law of Demeter, LoD):一個軟件實體應當盡可能少地與其他實體發生相互作用。
六個創建型模式
簡單工廠模式-Simple Factory Pattern【學習難度:,使用頻率:】
工廠三兄弟之簡單工廠模式(一):圖表庫的設計
工廠三兄弟之簡單工廠模式(二):簡單工廠模式概述
工廠三兄弟之簡單工廠模式(三):圖表庫的簡單工廠模式解決方案
工廠三兄弟之簡單工廠模式(四):圖表庫解決方案的改進,簡單工廠模式的簡化,簡單工廠模式總結
工廠方法模式-Factory Method Pattern【學習難度:,使用頻率:】
工廠三兄弟之工廠方法模式(一):日志記錄器的設計
工廠三兄弟之工廠方法模式(二):工廠方法模式概述
工廠三兄弟之工廠方法模式(三):日志記錄器的工廠方法模式解決方案,反射與配置文件
工廠三兄弟之工廠方法模式(四):重載的工廠方法,工廠方法的隱藏,工廠方法模式總結
抽象工廠模式-Abstract Factory Pattern【學習難度:,使用頻率:】
工廠三兄弟之抽象工廠模式(一):界面皮膚庫的初始設計
工廠三兄弟之抽象工廠模式(二):產品等級結構與產品族
工廠三兄弟之抽象工廠模式(三):抽象工廠模式概述
工廠三兄弟之抽象工廠模式(四):界面皮膚庫的抽象工廠模式解決方案
工廠三兄弟之抽象工廠模式(五):“開閉原則”的傾斜性,抽象工廠模式總結
單例模式-Singleton Pattern【學習難度:,使用頻率:】
確保對象的唯一性——單例模式 (一):單例模式的動機,單例模式概述
確保對象的唯一性——單例模式 (二):負載均衡器的設計與實現
確保對象的唯一性——單例模式 (三):餓漢式單例與懶漢式單例的討論
確保對象的唯一性——單例模式 (四):一種更好的單例實現方法(靜態內部類)
確保對象的唯一性——單例模式 (五):單例模式總結
原型模式-Prototype Pattern【學習難度:,使用頻率:】
對象的克隆——原型模式(一):大同小異的工作周報,原型模式概述
對象的克隆——原型模式(二):工作周報的原型模式解決方案
對象的克隆——原型模式(三):帶附件的周報【淺克隆,深克隆】
對象的克隆——原型模式(四):原型管理器的引入和實現,原型模式總結
建造者模式-Builder Pattern【學習難度:,使用頻率:】
復雜對象的組裝與創建——建造者模式(一):游戲角色設計,建造者模式概述
復雜對象的組裝與創建——建造者模式(二):游戲角色設計的建造者模式解決方案
復雜對象的組裝與創建——建造者模式(三):關于Director的進一步討論,建造者模式總結
七個結構型模式
適配器模式-Adapter Pattern【學習難度:,使用頻率:】
不兼容結構的協調——適配器模式(一):沒有源碼的算法庫,適配器模式概述
不兼容結構的協調——適配器模式(二):沒有源碼的算法庫的適配器模式解決方案
不兼容結構的協調——適配器模式(三):類適配器,雙向適配器
不兼容結構的協調——適配器模式(四):缺省適配器,適配器模式總結
橋接模式-Bridge Pattern【學習難度:****,使用頻率:********】
處理多維度變化——橋接模式(一):跨平臺圖像瀏覽系統
處理多維度變化——橋接模式(二):橋接模式概述
處理多維度變化——橋接模式(三):跨平臺圖像瀏覽系統的橋接模式解決方案
處理多維度變化——橋接模式(四):適配器模式與橋接模式的聯用,橋接模式總結
組合模式-Composite Pattern【學習難度:,使用頻率:】
樹形結構的處理——組合模式(一):設計殺毒軟件的框架結構
樹形結構的處理——組合模式(二):組合模式概述
樹形結構的處理——組合模式(三):殺毒軟件的框架結構的組合模式解決方案
樹形結構的處理——組合模式(四):透明組合模式與安全組合模式
樹形結構的處理——組合模式(五):公司組織結構,組合模式總結
裝飾模式-Decorator Pattern【學習難度:,使用頻率:】
擴展系統功能——裝飾模式(一):圖形界面構件庫的設計
擴展系統功能——裝飾模式(二):裝飾模式概述
擴展系統功能——裝飾模式(三):圖形界面構件庫的裝飾模式解決方案
擴展系統功能——裝飾模式(四):透明裝飾模式與半透明裝飾模式,裝飾模式注意事項,裝飾模式總結
外觀模式-Facade Pattern【學習難度:,使用頻率:】
深入淺出外觀模式(一):外觀模式概述,外觀模式結構與實現
深入淺出外觀模式(二):外觀模式應用實例(文件加密模塊)
深入淺出外觀模式(三):抽象外觀類,外觀模式效果與適用場景
享元模式-Flyweight Pattern【學習難度:,使用頻率:】
實現對象的復用——享元模式(一):圍棋棋子的設計,享元模式概述(上)
實現對象的復用——享元模式(二):享元模式概述(下)
實現對象的復用——享元模式(三):圍棋棋子的享元模式解決方案
實現對象的復用——享元模式(四):帶外部狀態的圍棋棋子解決方案
實現對象的復用——享元模式(五):單純享元模式和復合享元模式,關于享元模式的幾點補充,享元模式總結
代理模式-Proxy Pattern【學習難度:,使用頻率:】
代理模式(一):代理模式概述,代理模式結構與實現
代理模式(二):代理模式應用實例(收費商務信息查詢系統)
代理模式(三):遠程代理,虛擬代理,緩沖代理
代理模式(四):代理模式效果與適用場景
十一個行為型模式
職責鏈模式-Chain of Responsibility Pattern【學習難度:,使用頻率:】
請求的鏈式處理——職責鏈模式(一):采購單的分級審批
請求的鏈式處理——職責鏈模式(二):職責鏈模式概述
請求的鏈式處理——職責鏈模式(三):采購單分級審批的職責鏈模式解決方案
請求的鏈式處理——職責鏈模式(四):純與不純的職責鏈模式,職責鏈模式總結
命令模式-Command Pattern【學習難度:******,使用頻率:********】**
請求發送者與接收者解耦——命令模式(一):自定義功能鍵,命令模式概述
請求發送者與接收者解耦——命令模式(二):自定義功能鍵的命令模式解決方案
請求發送者與接收者解耦——命令模式(三):命令隊列的實現
請求發送者與接收者解耦——命令模式(四):撤銷操作的簡單實現
請求發送者與接收者解耦——命令模式(五):請求日志
請求發送者與接收者解耦——命令模式(六):宏命令,命令模式總結
解釋器模式-Interpreter Pattern【學習難度:,使用頻率:】
自定義語言的實現——解釋器模式(一):機器人控制程序
自定義語言的實現——解釋器模式(二):文法規則和抽象語法樹
自定義語言的實現——解釋器模式(三):解釋器模式概述
自定義語言的實現——解釋器模式(四):機器人控制程序的解釋器模式解決方案
自定義語言的實現——解釋器模式(五):再談Context的作用
自定義語言的實現——解釋器模式(六):解釋器模式總結
迭代器模式-Iterator Pattern【學習難度:,使用頻率:】
遍歷聚合對象中的元素——迭代器模式(一):銷售管理系統中數據的遍歷
遍歷聚合對象中的元素——迭代器模式(二):迭代器模式概述
遍歷聚合對象中的元素——迭代器模式(三):銷售管理系統中數據的遍歷的迭代器模式解決方案
遍歷聚合對象中的元素——迭代器模式(四):使用內部類實現迭代器
遍歷聚合對象中的元素——迭代器模式(五):JDK內置迭代器的使用
遍歷聚合對象中的元素——迭代器模式(六):迭代器模式總結
中介者模式-Mediator Pattern【學習難度:,使用頻率:】
協調多個對象之間的交互——中介者模式(一):客戶信息管理窗口的初始設計
協調多個對象之間的交互——中介者模式(二):中介者模式概述
協調多個對象之間的交互——中介者模式(三):客戶信息管理窗口的中介者模式解決方案
協調多個對象之間的交互——中介者模式(四):中介者與同事類的擴展
協調多個對象之間的交互——中介者模式(五):中介者模式總結
備忘錄模式-Memento Pattern【學習難度:,使用頻率:】
撤銷功能的實現——備忘錄模式(一):可悔棋的中國象棋
撤銷功能的實現——備忘錄模式(二):備忘錄模式概述
撤銷功能的實現——備忘錄模式(三):中國象棋的備忘錄模式解決方案
撤銷功能的實現——備忘錄模式(四):實現多次撤銷
撤銷功能的實現——備忘錄模式(五):再談備忘錄的封裝,備忘錄模式總結
觀察者模式-Observer Pattern【學習難度:,使用頻率:】
對象間的聯動——觀察者模式(一):多人聯機對戰游戲的設計
對象間的聯動——觀察者模式(二):觀察者模式概述
對象間的聯動——觀察者模式(三):多人聯機對戰游戲的觀察者模式解決方案
對象間的聯動——觀察者模式(四):JDK對觀察者模式的支持
對象間的聯動——觀察者模式(五):觀察者模式與Java事件處理
對象間的聯動——觀察者模式(六):觀察者模式與MVC,觀察者模式總結
狀態模式-State Pattern【學習難度:,使用頻率:】
處理對象的多種狀態及其相互轉換——狀態模式(一):銀行系統中的賬戶類設計
處理對象的多種狀態及其相互轉換——狀態模式(二):狀態模式概述
處理對象的多種狀態及其相互轉換——狀態模式(三):賬戶類的狀態模式解決方案
處理對象的多種狀態及其相互轉換——狀態模式(四):共享狀態的實現
處理對象的多種狀態及其相互轉換——狀態模式(五):使用環境類實現狀態轉換
處理對象的多種狀態及其相互轉換——狀態模式(六):狀態模式總結
策略模式-Strategy Pattern【學習難度:,使用頻率:】
符合的原則:開閉原則
算法的封裝與切換——策略模式(一):電影票打折方案
算法的封裝與切換——策略模式(二):策略模式概述
算法的封裝與切換——策略模式(三):電影票打折方案的策略模式解決方案
算法的封裝與切換——策略模式(四):策略模式的兩個典型應用,策略模式總結
模板方法模式-Template Method Pattern【學習難度:,使用頻率:】
模板方法模式深度解析(一):模板方法模式概述,模板方法模式結構與實現
模板方法模式深度解析(二):模板方法模式應用實例(銀行利息計算模塊)
模板方法模式深度解析(三):鉤子方法的使用,模板方法模式效果與適用場景
訪問者模式-Visitor Pattern【學習難度:,使用頻率:】
操作復雜對象結構——訪問者模式(一):OA系統中員工數據匯總
操作復雜對象結構——訪問者模式(二):訪問者模式概述
操作復雜對象結構——訪問者模式(三):OA系統中員工數據匯總的訪問者模式解決方案
操作復雜對象結構——訪問者模式(四):訪問者模式與組合模式聯用,訪問者模式總結
設計模式趣味學習(復習)
設計模式與足球(一):創建型模式
設計模式與足球(二):結構型模式
設計模式與足球(三):行為型模式(上)
設計模式與足球(四):行為型模式(下)
設計模式綜合應用實例
多人聯機射擊游戲
多人聯機射擊游戲中的設計模式應用(一):抽象工廠模式,建造者模式,工廠方法模式,迭代器模式,命令模式多人聯機射擊游戲中的設計模式應用(二):觀察者模式,單例模式,狀態模式,適配器模式
數據庫同步系統
設計模式綜合實例分析之數據庫同步系統(一):數據庫同步系統概述,建造者模式,簡單工廠模式設計模式綜合實例分析之數據庫同步系統(二):享元模式,單例模式,觀察者模式,模板方法模式
設計模式綜合實例分析之數據庫同步系統(三):策略模式,組合模式,命令模式,職責鏈模式
最后補上一張設計模式之間的關系圖
【作者:劉偉 http://blog.csdn.net/lovelion】
參考
http://blog.csdn.net/lovelion/article/details/7563445
http://blog.csdn.net/vebasan/article/details/8003078
http://blog.csdn.net/vebasan/article/details/8003102
http://www.oracle.com/technetwork/articles/javase/jpl-proposals-140227.html