1.什么是設(shè)計模式?
在我的理解中設(shè)計模式是一種抽象設(shè)計的方法(面向?qū)ο?,組件分裝,設(shè)計模式,架構(gòu)模式)。
說說這幾種的不同之處。這幾種抽象方法是由小至大,由內(nèi)至外,由細節(jié)至整體的。
面向?qū)ο蟾嗟氖钦Z法上的抽象,通過繼承(復(fù)用現(xiàn)有代碼),封裝(隱藏內(nèi)部實現(xiàn)),多態(tài)(改寫對象行為),模板等特性將程序中功能相似或者實現(xiàn)目標相似的這一類東西包裝成一個整體,一個對象稱之為面向?qū)ο缶幊獭?/p>
而組件封裝是讓不同對象各司其職,從而達到松耦合。
設(shè)計模式是將解決某一類常常碰到的問題最好的解決方案、設(shè)計經(jīng)驗的總結(jié)。
而架構(gòu)模式則是對一整個項目的架構(gòu)做出最好的解決方法。
這些事情的核心就是復(fù)用代碼,從復(fù)雜的代碼中抽象出最好的、不變的方法套用到其他的程序中,大大降低了程序需求變化所付出的代價(將代價減為最?。夥帕松a(chǎn)力。
2.面向?qū)ο笤O(shè)計原則(重要)
1.依賴倒置原則(DIP)
1.高層模塊(穩(wěn)定)不應(yīng)該依賴于底層模塊(變化),二者都應(yīng)該依賴于抽象
2.抽象(穩(wěn)定)不應(yīng)該依賴于實現(xiàn)細節(jié)(變化),實現(xiàn)細節(jié)應(yīng)該依賴于抽象(穩(wěn)定)
簡單來說就是變化的要依賴穩(wěn)定的,實現(xiàn)細節(jié)要依賴高層的(聲明抽象調(diào)用)。這樣子當程序需求改變使我們只需要在特定的某個模塊(實現(xiàn)細節(jié)的模塊)更改代碼,而不需要在許多的文件中都要更改代碼(這樣做的話一定是高層依賴于細節(jié)了,要更改設(shè)計模式甚至重構(gòu)代碼)。
2.開放封閉原則
1.對擴張開放,對更改封閉
2.類模塊應(yīng)該是可擴展的,但是不可修改
這一點仔細想想就是對上一點的另一種表述,高層模塊應(yīng)該是穩(wěn)定的(封閉不可修改的),而擴張是開放的,可擴展的(可以想為實現(xiàn)細節(jié),像繼承和派生)
3.單一職業(yè)原則(SRP)
1.一個類應(yīng)該僅有一個引起它變化的原因
2.變化的方向隱含類的責任
每個類應(yīng)該只能完成一個具體的功能,做一種單一的job。這樣使得這個類在需要維護時更加簡便。
4.Liskov替換原則(LSP)
1.子類必須能夠替換他們的基類(IS-A)
2.繼承表達類型抽象
子類方法要是父類方法拓展中的一種
子類可以擴展父類的功能,但不能改變父類原有的功能
子類可以實現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。
子類中可以增加自己特有的方法。
當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
當子類的方法實現(xiàn)父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。
5.接口隔離原則(ISP)
1.不應(yīng)該強迫客戶程序依賴它們不用的方法
2.接口應(yīng)該小而完備
一種接口只做一件事。
6.優(yōu)先使用對象組合,而不是類繼承
1.類繼承通常為“白箱服用”,對象組合通常為黑箱復(fù)用
2.繼承在某種程序上破壞了封裝性,子類父類耦合度高
3.而在對象組合則只要求被組合的對象具有良好的定義的接口,耦合度低
7.分裝變化點
1.使用封裝來創(chuàng)建對象之間的分界層,讓設(shè)計者可以在分界層的一側(cè)進行修改,而不會對另一側(cè)產(chǎn)生不良的影響,從而實現(xiàn)層次間的松耦合
8.針對接口編程,而不是針對實現(xiàn)編程
1.不降變量類型聲明為某個特定的具體類,而是聲明為某個接口
2.客戶程序無需獲知對象的具體類型,只需要知道對象所具有的接口
3.減少系統(tǒng)中各部分的依賴關(guān)系,從而實現(xiàn)“高內(nèi)聚,松耦合”的類型設(shè)計方案
上面三點不做補充說明了,說得很明白了。