設(shè)計(jì)模式是軟件開(kāi)發(fā)大佬總結(jié)出來(lái)的解決某些特定的問(wèn)題的一般性方案。
目的:使代碼更容易被人理解,可靠性更高,更容易被復(fù)用。
一、開(kāi)放-封閉原則 : 是指軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該是可以擴(kuò)展,但是不可以修改;對(duì)于擴(kuò)展開(kāi)放,對(duì)于更改封閉。
1.無(wú)論模塊是多么的“封閉”,都會(huì)存在一些無(wú)法對(duì)之封閉的變化。既然不可能完全封閉,設(shè)計(jì)人員必須對(duì)于他設(shè)計(jì)的模塊應(yīng)該對(duì)哪種變化封閉做出選擇。他必須先猜測(cè)出最有可能發(fā)生變化的種類,然后構(gòu)造抽象來(lái)隔離那些變化。
2.在我們最初編寫代碼時(shí),假設(shè)變化不會(huì)發(fā)生。當(dāng)變化發(fā)生時(shí),我們就創(chuàng)建抽象來(lái)隔離以后發(fā)生的同類變化。
3.面對(duì)需求,對(duì)程序的改動(dòng)是通過(guò)增加代碼進(jìn)行的,而不是更改現(xiàn)有的代碼。
4.我們希望的是在開(kāi)發(fā)工作展開(kāi)不久就知道可能發(fā)生的變化。查明可能發(fā)生的變化所等待的時(shí)間越長(zhǎng),要?jiǎng)?chuàng)建正確的抽象就越困難。
5.開(kāi)放-封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在。遵循這個(gè)原則可以帶來(lái)面向?qū)ο蠹夹g(shù)所聲稱的巨大好處,也就是可維護(hù)、可擴(kuò)展、可復(fù)用、靈活性好。開(kāi)發(fā)人員應(yīng)該僅針對(duì)程序中呈現(xiàn)出頻繁變化的那些部分作出抽象,然而,對(duì)于應(yīng)用程序中的每個(gè)部分都刻意的進(jìn)行抽象同樣不是一個(gè)好主意。拒絕不成熟的抽象和抽象本身一樣重要。
二、單一職責(zé)原則:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。
1.如果一個(gè)類承擔(dān)的職責(zé)過(guò)多,就等于把這些職責(zé)耦合在一起,一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)變化發(fā)生時(shí),設(shè)計(jì)會(huì)遭受到意想不到的破壞。
2.軟件設(shè)計(jì)真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責(zé)并且將這些職責(zé)分離。如果你能想到多于一個(gè)動(dòng)機(jī)去改變一個(gè)類,那么這個(gè)類就有多于一個(gè)的職責(zé),就應(yīng)該考慮類的職責(zé)分離。
三、依賴倒轉(zhuǎn)原則:要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。
A. 高層模塊不應(yīng)該依賴低層模塊,兩個(gè)都應(yīng)該依賴抽象。
B. 抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。
1.依賴倒轉(zhuǎn)其實(shí)可以說(shuō)是面向?qū)ο笤O(shè)計(jì)的標(biāo)志,用哪種語(yǔ)言來(lái)編寫程序不重要,如果編寫時(shí)考慮的都是如何針對(duì)抽象編程而不是針對(duì)細(xì)節(jié)編程,即程序中所有的依賴關(guān)系都是終止于抽象類或者接口,那就是面向?qū)ο蟮脑O(shè)計(jì),反之那就是過(guò)程化的設(shè)計(jì)了。
四、里氏替換原則:子類型必須要能夠替換掉它們的父類型。
1.一個(gè)軟件實(shí)體如果使用的是一個(gè)父類的話,那么一定適用于其子類,而且它察覺(jué)不出父類對(duì)象和子類對(duì)象的區(qū)別。也就是說(shuō),在軟件里面,把父類都替換成它的子類,程序的行為沒(méi)有變化。
2.也就是因?yàn)檫@個(gè)原則,使得繼承復(fù)用成為了可能,只有當(dāng)子類可以替換掉父類,軟件單位的功能不受影響時(shí),父類才能真正的被復(fù)用,而子類也能夠在父類的基礎(chǔ)上增加新的行為。
五、迪米特法則(最少知道原則):如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)該發(fā)生直接的相互作用。如果其中一個(gè)類需要調(diào)用另外一個(gè)類的某一個(gè)方法的話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。
1.在類的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類都應(yīng)當(dāng)盡量降低成員的訪問(wèn)權(quán)限。
2.迪米特法則其根本思想,是強(qiáng)調(diào)了類之間的松耦合。類之間的耦合越弱,越有利于復(fù)用,一個(gè)處在弱耦合的類被修改,不會(huì)對(duì)有關(guān)系的類造成波及。
六、接口隔離原則:每個(gè)接口中不存在子類用不到卻必須實(shí)現(xiàn)的方法,如果不然,就要將接口拆分。使用多個(gè)隔離的接口,比使用單個(gè)接口(多個(gè)接口方法集合到一個(gè)的接口)要好。
七、合成復(fù)用原則:原則是盡量首先使用合成/聚合的方式,而不是使用繼承。
聚合:表示一種弱的“擁有”關(guān)系,體現(xiàn)的是A對(duì)象可以包含B對(duì)象,但B對(duì)象不是A對(duì)象的一部分,如:雁群和大雁。
組合:表示一種強(qiáng)的“擁有”關(guān)系,體現(xiàn)了嚴(yán)格的部分和整體的關(guān)系,部分和整體的生命周期一樣,如:鳥(niǎo)和翅膀。
—— 摘自 程杰 《大話設(shè)計(jì)模式》