設(shè)計(jì)模式的原則

設(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ì)模式》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容