設(shè)計模式的原則
設(shè)計模式的原則總結(jié)起來就是抵御變化溪烤。我們在軟件設(shè)計的時候县昂,當(dāng)功能需求發(fā)生變化的時候,盡可能的不去修改源代碼棍弄,盡量的將變化的范圍降到最小望薄。
1. 依賴倒置原則(DIP)
比如說:現(xiàn)在我們定義了一個框架,我們調(diào)用這個框架去畫各種各樣的形狀『艋現(xiàn)在我們將所有形狀都抽象成一個抽象類痕支,各個具體的形狀就是去繼承這個抽象類,并完成各自的細(xì)節(jié)蛮原。我們知道這里的抽象類是穩(wěn)定的卧须,而各種具體的形狀是變化的。所以我們框架實現(xiàn)的時候就應(yīng)該穩(wěn)定的抽象類儒陨,而不應(yīng)該依賴于不穩(wěn)定的底層模塊花嘶。
總結(jié):高層模塊(穩(wěn)定)不應(yīng)該依賴于低層模塊(變化),二者都應(yīng)該依賴于抽象(穩(wěn)定)蹦漠。
? ? ? ? 抽象(穩(wěn)定)不應(yīng)該依賴于實現(xiàn)細(xì)節(jié)(變化)椭员,實現(xiàn)細(xì)節(jié)應(yīng)該依賴于抽象(穩(wěn)定)。
2. 開放封閉原則(OCP)
比如前面提到的各個形狀的抽象類笛园,對于這個抽象類隘击,各種各樣的具體形狀都是可以繼承的侍芝,但是出現(xiàn)新的形狀的時候,我們只是應(yīng)該修改各個具體類的實現(xiàn)細(xì)節(jié)埋同,不應(yīng)該去修改抽象類的源代碼
總結(jié):對擴(kuò)展開放州叠,對修改關(guān)閉,類模塊應(yīng)該是可擴(kuò)展的莺禁,但是不可修改留量。
3. 單一職責(zé)原則(SRP)
一個類應(yīng)該是代表的一類事物,而不應(yīng)該包含任何其他的事物哟冬。
一個類應(yīng)該僅有一個引起它變化的原因楼熄,變化的方向隱含著類的責(zé)任。
4. Liskov替換原則(LSP)
因為我們在高層設(shè)計的時候浩峡,依賴的時更穩(wěn)定的抽象類可岂,所以說我們在初始化一個子類的時候,應(yīng)該用一個具體抽象類的指針去接收翰灾。所以子類應(yīng)該是一個基類缕粹。如果子類發(fā)現(xiàn)基類的方法不可用,然后進(jìn)行異常處理纸淮,那么這樣的子類就不能替換基類平斩,那么就不符合我們的里氏替換原則。
總結(jié):子類必須能夠替換他們的基類(IS-A)咽块。繼承表達(dá)類型抽象绘面。
5. 接口隔離原則(ISP)
比如說:如果是本類使用的接口,就應(yīng)該private侈沪,如果只是子類要使用的揭璃,用pretected。不要所有的接口的作用范圍都是public亭罪,真正有必要的時候才將接口暴露瘦馍。
不應(yīng)該強(qiáng)迫客戶程序依賴他們不用的方法,接口應(yīng)該小而完備应役。
6. 優(yōu)先使用對象組合情组,而不是類繼承
類繼承通常為“白箱復(fù)用”,對象組合通常為“黑箱復(fù)用”
繼承在某種程度上破壞了封裝性箩祥,子類父類耦合度高
而對象組合只要求被組合的對象具有良好定義的接口呻惕,耦合度低。
7. 封裝變化點
使用封裝來創(chuàng)建對象之間的分界層滥比,讓設(shè)計者可以在分界層的一側(cè)進(jìn)行修改,而不會對另一側(cè)產(chǎn)生不良的影響做院,從而實現(xiàn)層次間的松耦合盲泛。
8. 針對接口編程濒持,而不是針對實現(xiàn)編程
不將變量類型聲明為某個特定的具體類,而是聲明為某個接口
客戶程序無需獲知對象的具體類型寺滚,只需要知道對象所具有哪些接口
減少系統(tǒng)中各部分的依賴關(guān)系柑营,從而實現(xiàn)“高內(nèi)聚,松耦合”的類型設(shè)計方案村视。