前言
眾所周知,軟件設(shè)計(jì)模式一共有23種,從今天開始,每天一種設(shè)計(jì)模式,關(guān)鍵理解,重在實(shí)踐。
每種設(shè)計(jì)模式會(huì)結(jié)合uml圖及源碼去進(jìn)行研究學(xué)習(xí),以達(dá)到熟練掌握的目標(biāo)。
設(shè)計(jì)原則
在學(xué)習(xí)設(shè)計(jì)模式前先了解一下軟件設(shè)計(jì)的一些基本原則,因?yàn)樗械哪J蕉际菫榱似ヅ溥@些開發(fā)原則而設(shè)計(jì)的。
1. 單一職責(zé)原則(Single Responsibility Principle)
一個(gè)類只有一個(gè)引起它變化的原因,也就是只有一個(gè)職責(zé)。每一個(gè)職責(zé)都是變化的一個(gè)軸線,如果一個(gè)類有一個(gè)以上的職責(zé),這些職責(zé)就耦合在了一起。當(dāng)一個(gè)職責(zé)發(fā)生變化時(shí),可能會(huì)影響其它的職責(zé),這樣的軟件結(jié)構(gòu)是我們不提倡的。另外,多個(gè)職責(zé)耦合在一起,會(huì)嚴(yán)重影響代碼的復(fù)用性。
2. 開閉原則(Open-Close Principle)
開閉原則就是說對擴(kuò)展開放,對修改關(guān)閉。在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼,實(shí)現(xiàn)一個(gè)熱插拔的效果。所以一句話概括就是:為了使程序的擴(kuò)展性好,易于維護(hù)和升級。想要達(dá)到這樣的效果,我們需要使用接口和抽象類。
3. 里氏代換原則(Liskov Substitution Principle)
里氏代換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。 里氏代換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。 LSP是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受到影響時(shí),基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。里氏代換原則是對“開-閉”原則的補(bǔ)充。實(shí)現(xiàn)“開-閉”原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。
4. 依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)
所謂依賴倒置原則(Dependence Inversion Principle)就是要依賴于抽象,不要依賴于具體。簡單的說就是要求對抽象進(jìn)行編程,不要對實(shí)現(xiàn)進(jìn)行編程,這樣就降低了客戶與實(shí)現(xiàn)模塊間的耦合。
實(shí)現(xiàn)開閉原則的關(guān)鍵是抽象化,并且從抽象化導(dǎo)出具體化實(shí)現(xiàn),如果說開閉原則是面向?qū)ο笤O(shè)計(jì)的目標(biāo)的話,那么依賴倒轉(zhuǎn)原則就是面向?qū)ο笤O(shè)計(jì)的主要手段。
5. 接口隔離原則(Interface Segregation Principle)
這個(gè)原則的意思是:使用多個(gè)隔離的接口,比使用單個(gè)接口要好。還是一個(gè)降低類之間的耦合度的意思,從這兒我們看出,其實(shí)設(shè)計(jì)模式就是一個(gè)軟件的設(shè)計(jì)思想,從大型軟件架構(gòu)出發(fā),為了升級和維護(hù)方便。
6. 合成復(fù)用原則(Composite Reuse Principle)
合成復(fù)用原則就是指在一個(gè)新的對象里通過關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)來使用一些已有的對象,使之成為新對象的一部分;新對象通過委派調(diào)用已有對象的方法達(dá)到復(fù)用其已有功能的目的。簡言之:要盡量使用組合/聚合關(guān)系,少用繼承。
7. 迪米特法則(Demeter Principle)
為什么叫最少知道原則,就是說:一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨(dú)立。也就是說一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用。這樣,當(dāng)一個(gè)模塊修改時(shí),就會(huì)盡量少的影響其他的模塊,擴(kuò)展會(huì)相對容易,這是對軟件實(shí)體之間通信的限制,它要求限制軟件實(shí)體之間通信的寬度和深度。
在了解了這幾類設(shè)計(jì)原則之后,會(huì)對我們之后學(xué)習(xí)設(shè)計(jì)模式起到如虎添翼的效果,可能有些原則這時(shí)還沒看懂,不過沒關(guān)系,我們會(huì)在之后的學(xué)習(xí)中更加了解設(shè)計(jì)原則的含義。
設(shè)計(jì)模式
設(shè)計(jì)模式共有23個(gè),可分為三大類:創(chuàng)建模式(5種),結(jié)構(gòu)模式(7種),行為模式(11種),我們一個(gè)一個(gè)來學(xué)習(xí)。
我把所有的源碼都放在了我的github上,有需要的同學(xué)自取,如果覺得還不錯(cuò)的話請star一下該項(xiàng)目 :)
創(chuàng)建模式
抽象工廠模式 (Abstract Factory)
建造者模式 (Builder)
工廠方法模式 (Factory Method)
原型模式 (Prototype)
單例模式 (Singleton)
結(jié)構(gòu)模式
適配器模式 (Adapter)
橋接模式 (Bridge)
組合模式 (Composite)
修飾模式 (Decorator)
外觀模式 (Facade)
享元模式 (Flyweight)
代理模式(Proxy)
行為模式
責(zé)任鏈模式 (Chain of Responsibility)
命令模式 (Command)
解釋器模式 (Interpreter)
迭代器模式 (Iterator)
中介者模式 (Mediator)
備忘錄模式 (Memento)
觀察者模式(Observer)
狀態(tài)模式 (State)
策略模式 (Strategy)
模板方法模式(Template Method)
訪問者模式 (Visitor)