最近在整理程序設(shè)計(jì)原則,但是只是憑自己的經(jīng)驗(yàn)簡單描述了一下肮柜,顯然不是很規(guī)范。設(shè)計(jì)的原則有單一職責(zé)倒彰、接口隔離审洞、開放封閉原則等,從這些原則中衍生出24中設(shè)計(jì)模式待讳。他說完這些我隱約是有些印象的芒澜,可能是知識(shí)不成體系,所有很容易忘記创淡。而且口語化的表達(dá)讓人感覺不專業(yè)痴晦。趁著今天有時(shí)間,做一個(gè)記錄琳彩。
“開發(fā)一個(gè)滿足規(guī)范的軟件就跟走在水面上一樣誊酌,除非是結(jié)了冰才行(或者需求凍結(jié)不變了)”——Edward V. Berard。
我們都清楚露乏,軟件開發(fā)的規(guī)格要求并不是一成不變的碧浊。你開發(fā)的軟件隨時(shí)都可能會(huì)發(fā)生變化。今天這個(gè)軟件的確是在履行它的職責(zé)瘟仿。但是這樣就夠了嗎箱锐?你設(shè)計(jì)的軟件能夠擁抱變化嗎?
好的面向?qū)ο蟮脑O(shè)計(jì)才是關(guān)鍵劳较。
如果你是這么想的驹止,那么請(qǐng)你問自己幾個(gè)問題。
- 你的代碼是可重用的嗎观蜗?
- 如果需求改變了臊恋,是否很容易能修改完成?
- 能否在不修改代碼的前提下進(jìn)行擴(kuò)展嫂便?
別擔(dān)心捞镰。并不是你一個(gè)人會(huì)面臨這些問題。我們會(huì)一塊學(xué)習(xí)如何能讓我們的軟件在面對(duì)改變時(shí)能更具靈活性毙替。
這個(gè)問題已經(jīng)有不少人研究過了岸售,他們得出的結(jié)論是OOD原則。
下面的文章從設(shè)計(jì)模式概述到設(shè)計(jì)原則厂画,再到具體的設(shè)計(jì)模式逐步遞進(jìn)凸丸。
基礎(chǔ)知識(shí)
設(shè)計(jì)模式概述
從招式與內(nèi)功談起——設(shè)計(jì)模式概述(一):設(shè)計(jì)模式從何而來?
從招式與內(nèi)功談起——設(shè)計(jì)模式概述(二):設(shè)計(jì)模式是什么袱院?
從招式與內(nèi)功談起——設(shè)計(jì)模式概述(三):設(shè)計(jì)模式有什么用屎慢?附:個(gè)人觀點(diǎn)
面向?qū)ο笤O(shè)計(jì)原則
面向?qū)ο笤O(shè)計(jì)原則概述
面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)原則
單一職責(zé)原則(Single Responsibility Principle, SRP):一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)瞭稼,或者可以定義為:就一個(gè)類而言,應(yīng)該只有一個(gè)引起它變化的原因腻惠。
面向?qū)ο笤O(shè)計(jì)原則之開閉原則
開閉原則(Open-Closed Principle, OCP):一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放环肘,對(duì)修改關(guān)閉。即軟件實(shí)體應(yīng)盡量在不修改原有代碼的情況下進(jìn)行擴(kuò)展集灌。
面向?qū)ο笤O(shè)計(jì)原則之里氏代換原則
里氏代換原則(Liskov Substitution Principle, LSP):所有引用基類(父類)的地方必須能透明地使用其子類的對(duì)象悔雹。
面向?qū)ο笤O(shè)計(jì)原則之依賴倒轉(zhuǎn)原則
依賴倒轉(zhuǎn)原則(Dependency Inversion Principle, DIP):抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象欣喧。換言之腌零,要針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程唆阿。
面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則
接口隔離原則(Interface Segregation Principle, ISP):使用多個(gè)專門的接口益涧,而不使用單一的總接口,即客戶端不應(yīng)該依賴那些它不需要的接口驯鳖。
面向?qū)ο笤O(shè)計(jì)原則之合成復(fù)用原則
合成復(fù)用原則(Composite Reuse Principle, CRP):盡量使用對(duì)象組合闲询,而不是繼承來達(dá)到復(fù)用的目的。
面向?qū)ο笤O(shè)計(jì)原則之迪米特法則
迪米特法則(Law of Demeter, LoD):一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用浅辙。
六個(gè)創(chuàng)建型模式
簡單工廠模式-Simple Factory Pattern【學(xué)習(xí)難度:嘹裂,使用頻率:】
工廠三兄弟之簡單工廠模式(一):圖表庫的設(shè)計(jì)
工廠三兄弟之簡單工廠模式(二):簡單工廠模式概述
工廠三兄弟之簡單工廠模式(三):圖表庫的簡單工廠模式解決方案
工廠三兄弟之簡單工廠模式(四):圖表庫解決方案的改進(jìn),簡單工廠模式的簡化摔握,簡單工廠模式總結(jié)
工廠方法模式-Factory Method Pattern【學(xué)習(xí)難度:,使用頻率:】
工廠三兄弟之工廠方法模式(一):日志記錄器的設(shè)計(jì)
工廠三兄弟之工廠方法模式(二):工廠方法模式概述
工廠三兄弟之工廠方法模式(三):日志記錄器的工廠方法模式解決方案丁寄,反射與配置文件
工廠三兄弟之工廠方法模式(四):重載的工廠方法氨淌,工廠方法的隱藏,工廠方法模式總結(jié)
抽象工廠模式-Abstract Factory Pattern【學(xué)習(xí)難度:伊磺,使用頻率:】
工廠三兄弟之抽象工廠模式(一):界面皮膚庫的初始設(shè)計(jì)
工廠三兄弟之抽象工廠模式(二):產(chǎn)品等級(jí)結(jié)構(gòu)與產(chǎn)品族
工廠三兄弟之抽象工廠模式(三):抽象工廠模式概述
工廠三兄弟之抽象工廠模式(四):界面皮膚庫的抽象工廠模式解決方案
工廠三兄弟之抽象工廠模式(五):“開閉原則”的傾斜性盛正,抽象工廠模式總結(jié)
單例模式-Singleton Pattern【學(xué)習(xí)難度:,使用頻率:】
確保對(duì)象的唯一性——單例模式 (一):單例模式的動(dòng)機(jī)屑埋,單例模式概述
確保對(duì)象的唯一性——單例模式 (二):負(fù)載均衡器的設(shè)計(jì)與實(shí)現(xiàn)
確保對(duì)象的唯一性——單例模式 (三):餓漢式單例與懶漢式單例的討論
確保對(duì)象的唯一性——單例模式 (四):一種更好的單例實(shí)現(xiàn)方法(靜態(tài)內(nèi)部類)
確保對(duì)象的唯一性——單例模式 (五):單例模式總結(jié)
原型模式-Prototype Pattern【學(xué)習(xí)難度:豪筝,使用頻率:】
對(duì)象的克隆——原型模式(一):大同小異的工作周報(bào),原型模式概述
對(duì)象的克隆——原型模式(二):工作周報(bào)的原型模式解決方案
對(duì)象的克隆——原型模式(三):帶附件的周報(bào)【淺克隆摘能,深克隆】
對(duì)象的克隆——原型模式(四):原型管理器的引入和實(shí)現(xiàn)续崖,原型模式總結(jié)
建造者模式-Builder Pattern【學(xué)習(xí)難度:,使用頻率:】
復(fù)雜對(duì)象的組裝與創(chuàng)建——建造者模式(一):游戲角色設(shè)計(jì)团搞,建造者模式概述
復(fù)雜對(duì)象的組裝與創(chuàng)建——建造者模式(二):游戲角色設(shè)計(jì)的建造者模式解決方案
復(fù)雜對(duì)象的組裝與創(chuàng)建——建造者模式(三):關(guān)于Director的進(jìn)一步討論严望,建造者模式總結(jié)
七個(gè)結(jié)構(gòu)型模式
適配器模式-Adapter Pattern【學(xué)習(xí)難度:,使用頻率:】
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(一):沒有源碼的算法庫逻恐,適配器模式概述
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(二):沒有源碼的算法庫的適配器模式解決方案
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(三):類適配器像吻,雙向適配器
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式(四):缺省適配器峻黍,適配器模式總結(jié)
橋接模式-Bridge Pattern【學(xué)習(xí)難度:****,使用頻率:********】
處理多維度變化——橋接模式(一):跨平臺(tái)圖像瀏覽系統(tǒng)
處理多維度變化——橋接模式(二):橋接模式概述
處理多維度變化——橋接模式(三):跨平臺(tái)圖像瀏覽系統(tǒng)的橋接模式解決方案
處理多維度變化——橋接模式(四):適配器模式與橋接模式的聯(lián)用拨匆,橋接模式總結(jié)
組合模式-Composite Pattern【學(xué)習(xí)難度:姆涩,使用頻率:】
樹形結(jié)構(gòu)的處理——組合模式(一):設(shè)計(jì)殺毒軟件的框架結(jié)構(gòu)
樹形結(jié)構(gòu)的處理——組合模式(二):組合模式概述
樹形結(jié)構(gòu)的處理——組合模式(三):殺毒軟件的框架結(jié)構(gòu)的組合模式解決方案
樹形結(jié)構(gòu)的處理——組合模式(四):透明組合模式與安全組合模式
樹形結(jié)構(gòu)的處理——組合模式(五):公司組織結(jié)構(gòu),組合模式總結(jié)
裝飾模式-Decorator Pattern【學(xué)習(xí)難度:惭每,使用頻率:】
擴(kuò)展系統(tǒng)功能——裝飾模式(一):圖形界面構(gòu)件庫的設(shè)計(jì)
擴(kuò)展系統(tǒng)功能——裝飾模式(二):裝飾模式概述
擴(kuò)展系統(tǒng)功能——裝飾模式(三):圖形界面構(gòu)件庫的裝飾模式解決方案
擴(kuò)展系統(tǒng)功能——裝飾模式(四):透明裝飾模式與半透明裝飾模式骨饿,裝飾模式注意事項(xiàng),裝飾模式總結(jié)
外觀模式-Facade Pattern【學(xué)習(xí)難度:洪鸭,使用頻率:】
深入淺出外觀模式(一):外觀模式概述样刷,外觀模式結(jié)構(gòu)與實(shí)現(xiàn)
深入淺出外觀模式(二):外觀模式應(yīng)用實(shí)例(文件加密模塊)
深入淺出外觀模式(三):抽象外觀類,外觀模式效果與適用場(chǎng)景
享元模式-Flyweight Pattern【學(xué)習(xí)難度:览爵,使用頻率:】
實(shí)現(xiàn)對(duì)象的復(fù)用——享元模式(一):圍棋棋子的設(shè)計(jì)置鼻,享元模式概述(上)
實(shí)現(xiàn)對(duì)象的復(fù)用——享元模式(二):享元模式概述(下)
實(shí)現(xiàn)對(duì)象的復(fù)用——享元模式(三):圍棋棋子的享元模式解決方案
實(shí)現(xiàn)對(duì)象的復(fù)用——享元模式(四):帶外部狀態(tài)的圍棋棋子解決方案
實(shí)現(xiàn)對(duì)象的復(fù)用——享元模式(五):單純享元模式和復(fù)合享元模式,關(guān)于享元模式的幾點(diǎn)補(bǔ)充蜓竹,享元模式總結(jié)
代理模式-Proxy Pattern【學(xué)習(xí)難度:箕母,使用頻率:】
代理模式(一):代理模式概述,代理模式結(jié)構(gòu)與實(shí)現(xiàn)
代理模式(二):代理模式應(yīng)用實(shí)例(收費(fèi)商務(wù)信息查詢系統(tǒng))
代理模式(三):遠(yuǎn)程代理俱济,虛擬代理嘶是,緩沖代理
代理模式(四):代理模式效果與適用場(chǎng)景
十一個(gè)行為型模式
職責(zé)鏈模式-Chain of Responsibility Pattern【學(xué)習(xí)難度:,使用頻率:】
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(一):采購單的分級(jí)審批
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(二):職責(zé)鏈模式概述
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(三):采購單分級(jí)審批的職責(zé)鏈模式解決方案
請(qǐng)求的鏈?zhǔn)教幚怼氊?zé)鏈模式(四):純與不純的職責(zé)鏈模式蛛碌,職責(zé)鏈模式總結(jié)
命令模式-Command Pattern【學(xué)習(xí)難度:******聂喇,使用頻率:********】**
請(qǐng)求發(fā)送者與接收者解耦——命令模式(一):自定義功能鍵,命令模式概述
請(qǐng)求發(fā)送者與接收者解耦——命令模式(二):自定義功能鍵的命令模式解決方案
請(qǐng)求發(fā)送者與接收者解耦——命令模式(三):命令隊(duì)列的實(shí)現(xiàn)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(四):撤銷操作的簡單實(shí)現(xiàn)
請(qǐng)求發(fā)送者與接收者解耦——命令模式(五):請(qǐng)求日志
請(qǐng)求發(fā)送者與接收者解耦——命令模式(六):宏命令蔚携,命令模式總結(jié)
解釋器模式-Interpreter Pattern【學(xué)習(xí)難度:希太,使用頻率:】
自定義語言的實(shí)現(xiàn)——解釋器模式(一):機(jī)器人控制程序
自定義語言的實(shí)現(xiàn)——解釋器模式(二):文法規(guī)則和抽象語法樹
自定義語言的實(shí)現(xiàn)——解釋器模式(三):解釋器模式概述
自定義語言的實(shí)現(xiàn)——解釋器模式(四):機(jī)器人控制程序的解釋器模式解決方案
自定義語言的實(shí)現(xiàn)——解釋器模式(五):再談Context的作用
自定義語言的實(shí)現(xiàn)——解釋器模式(六):解釋器模式總結(jié)
迭代器模式-Iterator Pattern【學(xué)習(xí)難度:,使用頻率:】
遍歷聚合對(duì)象中的元素——迭代器模式(一):銷售管理系統(tǒng)中數(shù)據(jù)的遍歷
遍歷聚合對(duì)象中的元素——迭代器模式(二):迭代器模式概述
遍歷聚合對(duì)象中的元素——迭代器模式(三):銷售管理系統(tǒng)中數(shù)據(jù)的遍歷的迭代器模式解決方案
遍歷聚合對(duì)象中的元素——迭代器模式(四):使用內(nèi)部類實(shí)現(xiàn)迭代器
遍歷聚合對(duì)象中的元素——迭代器模式(五):JDK內(nèi)置迭代器的使用
遍歷聚合對(duì)象中的元素——迭代器模式(六):迭代器模式總結(jié)
中介者模式-Mediator Pattern【學(xué)習(xí)難度:酝蜒,使用頻率:】
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(一):客戶信息管理窗口的初始設(shè)計(jì)
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(二):中介者模式概述
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(三):客戶信息管理窗口的中介者模式解決方案
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(四):中介者與同事類的擴(kuò)展
協(xié)調(diào)多個(gè)對(duì)象之間的交互——中介者模式(五):中介者模式總結(jié)
備忘錄模式-Memento Pattern【學(xué)習(xí)難度:誊辉,使用頻率:】
撤銷功能的實(shí)現(xiàn)——備忘錄模式(一):可悔棋的中國象棋
撤銷功能的實(shí)現(xiàn)——備忘錄模式(二):備忘錄模式概述
撤銷功能的實(shí)現(xiàn)——備忘錄模式(三):中國象棋的備忘錄模式解決方案
撤銷功能的實(shí)現(xiàn)——備忘錄模式(四):實(shí)現(xiàn)多次撤銷
撤銷功能的實(shí)現(xiàn)——備忘錄模式(五):再談備忘錄的封裝,備忘錄模式總結(jié)
觀察者模式-Observer Pattern【學(xué)習(xí)難度:亡脑,使用頻率:】
對(duì)象間的聯(lián)動(dòng)——觀察者模式(一):多人聯(lián)機(jī)對(duì)戰(zhàn)游戲的設(shè)計(jì)
對(duì)象間的聯(lián)動(dòng)——觀察者模式(二):觀察者模式概述
對(duì)象間的聯(lián)動(dòng)——觀察者模式(三):多人聯(lián)機(jī)對(duì)戰(zhàn)游戲的觀察者模式解決方案
對(duì)象間的聯(lián)動(dòng)——觀察者模式(四):JDK對(duì)觀察者模式的支持
對(duì)象間的聯(lián)動(dòng)——觀察者模式(五):觀察者模式與Java事件處理
對(duì)象間的聯(lián)動(dòng)——觀察者模式(六):觀察者模式與MVC堕澄,觀察者模式總結(jié)
狀態(tài)模式-State Pattern【學(xué)習(xí)難度:,使用頻率:】
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(一):銀行系統(tǒng)中的賬戶類設(shè)計(jì)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(二):狀態(tài)模式概述
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(三):賬戶類的狀態(tài)模式解決方案
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(四):共享狀態(tài)的實(shí)現(xiàn)
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(五):使用環(huán)境類實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換
處理對(duì)象的多種狀態(tài)及其相互轉(zhuǎn)換——狀態(tài)模式(六):狀態(tài)模式總結(jié)
策略模式-Strategy Pattern【學(xué)習(xí)難度:霉咨,使用頻率:】
符合的原則:開閉原則
算法的封裝與切換——策略模式(一):電影票打折方案
算法的封裝與切換——策略模式(二):策略模式概述
算法的封裝與切換——策略模式(三):電影票打折方案的策略模式解決方案
算法的封裝與切換——策略模式(四):策略模式的兩個(gè)典型應(yīng)用蛙紫,策略模式總結(jié)
模板方法模式-Template Method Pattern【學(xué)習(xí)難度:,使用頻率:】
模板方法模式深度解析(一):模板方法模式概述躯护,模板方法模式結(jié)構(gòu)與實(shí)現(xiàn)
模板方法模式深度解析(二):模板方法模式應(yīng)用實(shí)例(銀行利息計(jì)算模塊)
模板方法模式深度解析(三):鉤子方法的使用惊来,模板方法模式效果與適用場(chǎng)景
訪問者模式-Visitor Pattern【學(xué)習(xí)難度:,使用頻率:】
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(一):OA系統(tǒng)中員工數(shù)據(jù)匯總
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(二):訪問者模式概述
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(三):OA系統(tǒng)中員工數(shù)據(jù)匯總的訪問者模式解決方案
操作復(fù)雜對(duì)象結(jié)構(gòu)——訪問者模式(四):訪問者模式與組合模式聯(lián)用棺滞,訪問者模式總結(jié)
設(shè)計(jì)模式趣味學(xué)習(xí)(復(fù)習(xí))
設(shè)計(jì)模式與足球(一):創(chuàng)建型模式
設(shè)計(jì)模式與足球(二):結(jié)構(gòu)型模式
設(shè)計(jì)模式與足球(三):行為型模式(上)
設(shè)計(jì)模式與足球(四):行為型模式(下)
設(shè)計(jì)模式綜合應(yīng)用實(shí)例
多人聯(lián)機(jī)射擊游戲
多人聯(lián)機(jī)射擊游戲中的設(shè)計(jì)模式應(yīng)用(一):抽象工廠模式裁蚁,建造者模式矢渊,工廠方法模式,迭代器模式枉证,命令模式多人聯(lián)機(jī)射擊游戲中的設(shè)計(jì)模式應(yīng)用(二):觀察者模式矮男,單例模式,狀態(tài)模式室谚,適配器模式
數(shù)據(jù)庫同步系統(tǒng)
設(shè)計(jì)模式綜合實(shí)例分析之?dāng)?shù)據(jù)庫同步系統(tǒng)(一):數(shù)據(jù)庫同步系統(tǒng)概述毡鉴,建造者模式,簡單工廠模式設(shè)計(jì)模式綜合實(shí)例分析之?dāng)?shù)據(jù)庫同步系統(tǒng)(二):享元模式秒赤,單例模式猪瞬,觀察者模式,模板方法模式
設(shè)計(jì)模式綜合實(shí)例分析之?dāng)?shù)據(jù)庫同步系統(tǒng)(三):策略模式入篮,組合模式陈瘦,命令模式,職責(zé)鏈模式
最后補(bǔ)上一張?jiān)O(shè)計(jì)模式之間的關(guān)系圖
【作者:劉偉 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