設(shè)計模式(Design pattern)是很多程序員總結(jié)出來的優(yōu)秀實踐福侈。保證了代碼的可重用性肪凛、易讀性以及代碼的可靠性。設(shè)計模式使代碼編制真正實現(xiàn)工程化翘鸭,它是是軟件工程的基石脈絡(luò)就乓,如同大廈的結(jié)構(gòu)一樣生蚁。
提到設(shè)計模式邦投,不得不感謝GoF(Gang of Four尼摹,四人組),他們1995年出版的《設(shè)計模式》一書阅懦,第一次將設(shè)計模式提升到理論高度耳胎,并將之規(guī)范化怕午。書中一共總結(jié)了23種基本的設(shè)計模式郁惜。而這23中設(shè)計模式幾乎涵蓋了面向?qū)ο笤O(shè)計過程中所有問題的解決方案兆蕉。書中提到的23種設(shè)計模式分別是:
1.單例模式 2.工廠方法模式 3.抽象工廠模式 4.模版方法模式 5.建造者模式 6.代理模式 7.原型模式 8.中介者模式 9.命令模式 10.責(zé)任鏈模式 11.裝飾模式 12.策略模式 13.適配器模式 14.迭代器模式 15.組合模式 16.觀察者模式 17.門面模式 18.備忘錄模式 19.訪問者模式 20.狀態(tài)模式 21.解釋器模式 22.享元模式 23.橋梁模式
設(shè)計模式六大原則
1易稠、開閉原則OCP
對擴(kuò)展開放驶社、對修改關(guān)閉衬吆。通俗一點的講逊抡,在程序需要進(jìn)行功能擴(kuò)展的時候冒嫡,不可去修改原有的代碼孝凌。這樣做的意義在于蟀架,延伸了程序的擴(kuò)展性的同時片拍,使得項目版本升級更方便,代碼更易維護(hù)纲缓。
2祝高、里氏代換原則LSP
? 所有引用基類(父類)的地方必須能透明地使用其子類的對象工闺,舉一個通俗易懂的例子來幫助理解:我喜歡動物斤寂,那我一定喜歡狗罗侯,因為狗是動物的子類钩杰;但是我喜歡狗讲弄,不能據(jù)此斷定我喜歡動物,因為我并不喜歡老鼠瓶摆,雖然它也是動物。
相信上面這個例子不難理解吧书斜,那我們再來一個程序中的例子:例如有兩個類荐吉,一個類為BaseClass父類,另一個是SubClass子類瞧哟,那么一個方法如果可以接受一個BaseClass類型的基類對象base的話勤揩,如:method1(base),那么它必然可以接受一個BaseClass類型的子類對象sub负蠕,如:method1(sub),都是可以正常運行的叠赐。反過來的代換不成立赛不,如果一個方法method2可以接受子類對象sub為參數(shù):method2(sub),那么一般而言不可以接受父類對象base,除非是重載方法斜脂。一句話來概括一下吧,能夠接受父類引用的方法,必然可以接受子類;而可以接受子類引用的方法产场,卻不能接受父類引用窿冯。
里氏替換原則通俗的來講就是:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能,假如我們不遵循里氏替換原則缠沈,那么寫的代碼出問題的概率會大大增加漱竖。
3躺率、控制反轉(zhuǎn)原則IOC
控制反轉(zhuǎn)良狈。在Java開發(fā)中薪丁,IoC意味著將你設(shè)計好的類交給系統(tǒng)去控制遇西,而不是在你的類內(nèi)部控制。這稱為控制反轉(zhuǎn)严嗜。
在傳統(tǒng)的實現(xiàn)中粱檀,由程序內(nèi)部代碼來控制程序之間的關(guān)系。我們經(jīng)常使用new關(guān)鍵字來實現(xiàn)兩組鍵間關(guān)系的組合漫玄,這種實現(xiàn)的方式會造成組件之間耦合(一個好的設(shè)計茄蚯,不但要實現(xiàn)代碼重用,還要將組件間關(guān)系解耦)。IoC很好的解決了該問題渗常,它將實現(xiàn)組件間關(guān)系從程序內(nèi)部提到外部容器來管理壮不。也就是說由容器在運行期將組件間的某種依賴關(guān)系動態(tài)的注入組件中〉是控制程序間關(guān)系的實現(xiàn)交給了外部的容器來完成忆畅。這里有著名的好萊塢理論:你呆著別動衡未,到時我會找你尸执。但是我們使用時候要注意一個問題,靜態(tài)類的使用會導(dǎo)致IoC設(shè)計原則受到限制缓醋,因為在Java世界如失,類的名稱是硬編碼的,所以靜態(tài)類的使用會導(dǎo)致類之間通過名稱綁定在一起送粱,這使得單獨測試某個組件變得更加困難褪贵。
4、接口隔離原則ISP
建立單一接口抗俄,不要建立龐大臃腫的接口脆丁,盡量細(xì)化接口,接口中的方法盡量少动雹。也就是說槽卫,我們要為各個類建立專用的接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調(diào)用胰蝠。
5歼培、迪米特法則DP
如果兩個軟件實體無需直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用茸塞,可以通過第三方轉(zhuǎn)發(fā)該調(diào)用躲庄。
優(yōu)點
降低類與類之間的耦合度
提高了類的可復(fù)用率和系統(tǒng)的擴(kuò)展性
缺點
過度使用會使系統(tǒng)產(chǎn)生大量的中介類,從而增加系統(tǒng)的復(fù)雜性钾虐,使模塊之間的通信效率降低噪窘。
6、合成復(fù)用原則
在實現(xiàn)復(fù)用時應(yīng)該多用關(guān)聯(lián)效扫,少用繼承倔监。
通過繼承來進(jìn)行復(fù)用的主要問題在于繼承復(fù)用會破壞系統(tǒng)的封裝性,因為繼承會將基類的實現(xiàn)細(xì)節(jié)暴露給子類荡短,由于基類的內(nèi)部細(xì)節(jié)通常對子類來說是可見的丐枉,所以這種復(fù)用又稱“白箱”復(fù)用,如果基類發(fā)生改變掘托,那么子類的實現(xiàn)也不得不發(fā)生改變瘦锹;從基類繼承而來的實現(xiàn)是靜態(tài)的,不可能在運行時發(fā)生改變,沒有足夠的靈活性弯院;
由于組合或聚合關(guān)系可以將已有的對象(也可稱為成員對象)納入到新對象中辱士,使之成為新對象的一部分,因此新對象可以調(diào)用已有對象的功能听绳,這樣做可以使得成員對象的內(nèi)部實現(xiàn)細(xì)節(jié)對于新對象不可見颂碘,所以這種復(fù)用又稱為“黑箱”復(fù)用,相對繼承關(guān)系而言椅挣,其耦合度相對較低头岔,成員對象的變化對新對象的影響不大,可以在新對象中根據(jù)實際需要有選擇性地調(diào)用成員對象的操作鼠证;合成復(fù)用可以在運行時動態(tài)進(jìn)行峡竣,新對象可以動態(tài)地引用與成員對象類型相同的其他對象。
在軟件設(shè)計的過程中量九,只要我們盡量遵循以上六條設(shè)計原則适掰,設(shè)計出來的軟件一定會是一個優(yōu)秀的軟件,它必定足夠健壯荠列、足夠穩(wěn)定类浪,并以極大的靈活性來迎接隨時而來的需求變更等因素
這里我只是簡要概括了6大原則的核心思想,附上我認(rèn)為講的很透徹的大神博客地址:https://blog.csdn.net/zhengzhb/category_9260995.html
其中最最經(jīng)典的一句就是用抽象構(gòu)建框架肌似,用實現(xiàn)擴(kuò)展細(xì)節(jié)费就。