我們在開發(fā)的過程中食铐,為了使代碼更加的靈活和易于擴(kuò)展,總會使用各種各樣的設(shè)計模式來設(shè)計我們的代碼。那么本系列文章就來詳細(xì)的介紹下設(shè)計模式
設(shè)計模式的分類
在java中按照設(shè)計模式大體上分為三類
1.創(chuàng)建型模式:抽象了對象實例化的過程用來幫助創(chuàng)建對象的實例
共5種:單例模式、建造者模式煌珊、原型模式、工廠方法模式泌豆、抽象工廠模式
2.結(jié)構(gòu)型模式:描述如何組合類和對象以獲得更大的結(jié)構(gòu)
共有7種:適配器模式定庵、裝飾模式、代理模式、門面模式(也稱為外觀模式)蔬浙、組合模式猪落、享元模式、橋梁模式
3.行為型模式:描述算法和對象間職責(zé)的分配
共有11種:策略模式敛滋、模板方法模式许布、觀察者模式兴革、迭代器模式绎晃、命令模式、責(zé)任鏈模式杂曲、備忘錄模式庶艾、訪問者模式、狀態(tài)模式擎勘、中介者模式咱揍、解釋器模式
當(dāng)然也有其他的分類方式,我們這里就不在進(jìn)行討論了
設(shè)計模式和面向?qū)ο笤O(shè)計原則
面向?qū)ο蟮姆治鲈O(shè)計有很多原則棚饵,這些原則大都從思想層面煤裙,給我們指出面向?qū)ο笏枷雽釉O(shè)計的正確方向。我們在進(jìn)行面向?qū)ο蠓治鲈O(shè)計的時候噪漾,應(yīng)該盡力的去遵守這些原則硼砰。
設(shè)計模式遵循的6大原則
1.單一職責(zé)原則(Single Responsibility Principle ,簡稱 SRP)
定義:應(yīng)該有且僅有一個原因引起類的變更
優(yōu)點:
1.降低了類的復(fù)雜性欣硼,各個類的職責(zé)清晰明確
2.提高了代碼的可讀性和可維護(hù)性
3.提高了系統(tǒng)的拓展性
2.里式替換原則(Liskov Substitution Principle ,簡稱 LSP)
定義:所有引用基類的地方都必須能透明地使用其子類的對象
里氏替換原則為良好的繼承定義了一個規(guī)范题翰,一句簡單的定義包含了四層含義:
1.子類必須完全實現(xiàn)父類的方法。如果子類不能完整地實現(xiàn)父類的方法诈胜,或者父類的某些方法在子類中已經(jīng)發(fā)生了改變豹障,則建議斷開父子繼承關(guān)系,采用依賴焦匈、聚集血公、組合等關(guān)系代替繼承;
2.子類可以有自己特有的屬性和方法缓熟;
3子類覆蓋或?qū)崿F(xiàn)父類的方法時輸入?yún)?shù)可以被放大(子類中的方法的前置條件必須與父類中被重寫的方法的前置條件相同或者更加寬松)累魔。
4重寫或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小
優(yōu)點
- 提高代碼復(fù)用性
- 父類的屬性方法可以用于子類
- 可以輕松的定義子類
- 使設(shè)計應(yīng)用程序變得簡單
3.依賴倒置原則(Dependence Inversion Principle,簡稱DIP)
定義:模塊間的依賴通過抽象發(fā)生,實現(xiàn)類之間不發(fā)生直接依賴關(guān)系荚虚,其依賴關(guān)系是通過接口或者抽象類產(chǎn)生的(即依賴抽象而不依賴具體)
優(yōu)點
1.規(guī)避一些非技術(shù)因素引起的問題
2.可以減少需求變化引起的工作量劇增的情況
依賴倒置原則在小型項目中很難體現(xiàn)
4薛夜、接口隔離原則(Interface Segregation Principle,簡稱ISP)
定義:
使用多個隔離的借口來降低耦合度版述,即將接口細(xì)化梯澜,為每個功能模塊提供單一的接口,而不是提供一個龐大而臃腫的接口來使用
接口隔離原則包含了一下四層含義:
1.接口細(xì)化,但是不能違背單一職責(zé)原則
2.接口要高內(nèi)聚晚伙,即提高接口吮龄、類、模塊的處理能力咆疗,減少對外交互漓帚。
3.定制服務(wù),即只為訪問者提供需要的方法
4.接口設(shè)計要有限度午磁,不可過度細(xì)化
5尝抖、迪米特法則(Low of Demeter,簡稱LoD迅皇,也稱為最少知道原則)
定義
一個對象應(yīng)該對其它對象有最少的了解
這句話的意思就是說一個類盡量不要對外公布太多的public方法和非靜態(tài)的內(nèi)部變量昧辽,盡量內(nèi)斂,這樣做是為了減少在修改時風(fēng)險的擴(kuò)大登颓。
迪特米法則的核心觀念就是類間解耦搅荞,弱耦合,只有弱耦合了之后框咙,類的復(fù)用率才得以提高
6咕痛、開閉原則
定義
簡單來說就是對修改關(guān)閉,對擴(kuò)展開放
注意:開閉原則對修改關(guān)閉喇嘱,對拓展開放茉贡,并不意味著不做任何修改,底層模塊的變更必然要有高層模塊進(jìn)行耦合婉称,否則就是一個孤立無意義的代碼片段块仆。
開閉原則的重要性
1.利于測試
2.提高了復(fù)用性
3.提高了可維護(hù)性
4.面向?qū)ο箝_發(fā)的要求
參考
《設(shè)計模式之禪》