設(shè)計模式設(shè)計原則

1、單一職責(zé)原則
2、里氏替換原則
3、依賴倒置原則
4、接口隔離原則
5、迪米特原則
6、開閉原則

1、單一職責(zé)原則

定義職責(zé)原則定義:

There should never be more than one reason for a class to change.

????意思是:一個類,應(yīng)當(dāng)只有一個引起它變化的原因;即一個類應(yīng)該只有一個職責(zé)。
就一個類而言,應(yīng)該只專注于做一件事和僅有一個引起變化的原因,這就是所謂的單一職責(zé)原則。該原則提出了對對象職責(zé)的一種理想期望,對象不應(yīng)該承擔(dān)太多的職責(zé),正如人不應(yīng)該一心分為二用。唯有專注,才能保證對象的高內(nèi)聚;唯有單一,才能保證對象的細(xì)粒度。對象的高內(nèi)聚與細(xì)粒度有利于對象的重用。一個龐大的對象承擔(dān)了太多的職責(zé),當(dāng)客戶端需用該對象的某一個職責(zé)時,就不得不將所有的職責(zé)都包含進(jìn)來,進(jìn)而造成冗余代碼。

單一職責(zé)的優(yōu)點(diǎn)有以下幾個方面:

  • 降低類的復(fù)雜性;
  • 提高類的可讀性;
  • 提高代碼的可維護(hù)性和復(fù)用性;
  • 降低因變更引起的風(fēng)險。

2、里氏替換原則

里氏替換原則定義:

在面向?qū)ο蟮恼Z言中,繼承是必不可少的、優(yōu)秀的語言機(jī)制,它主要有以下幾個優(yōu)點(diǎn):

  • 代碼共享,較少創(chuàng)建類的工作量,每個子類都擁有父類的方法和屬性;
  • 提高代碼的可重用性;
  • 提高代碼的可擴(kuò)展性;
  • 提高產(chǎn)品或項目的可開放性。

相應(yīng)的,繼承也存在缺點(diǎn),主要體現(xiàn)在以下幾個方面:

  • 繼承是入侵式的。只要繼承,就必須擁有父類的所有屬性和方法。
  • 降低代碼的靈活性。子類必須擁有父類的屬性和方法,使子類受到限制。
  • 增強(qiáng)了耦合性。當(dāng)父類的常量、變量和方法修改時,必須考慮子類的修改,這種修改可能造成大片的代碼需要重構(gòu)。

里氏替換原則定義了一個規(guī)范,它包含4層含義:

  • 子類必須完全實(shí)現(xiàn)父類的方法;
  • 子類可以有自己的個性;
  • 覆蓋或?qū)崿F(xiàn)父類的方法時輸入?yún)?shù)可以被放大;
  • 覆蓋或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小。

在設(shè)計模式里體現(xiàn)里氏替換原則的有如下幾個模式:

  • 策略模式
  • 組合模式
  • 代理模式

3、依賴倒置原則

依賴倒置原則英文名稱是:Dependence Inversion Principle,簡稱DIP
依賴倒置原則的定義:

High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.

翻譯過來,包含三個方面:

  • 高層模塊不應(yīng)該依賴低層模塊,兩者都依賴其抽象;
  • 抽象不依賴細(xì)節(jié);
  • 細(xì)節(jié)應(yīng)該依賴于抽象。

依賴倒置原則在Java語言中表現(xiàn)是:

  • 模塊間的依賴通過抽象產(chǎn)生,實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是通過接口或抽象類產(chǎn)生;
  • 接口或抽象類不依賴于實(shí)現(xiàn)類;
  • 實(shí)現(xiàn)類依賴于接口或抽象類。

????依賴倒置原則更加精確的定義就是“面向接口編程”-OOD(Object Oriented Design)的精髓之一。依賴倒置原則可以減少類之間的耦合性,提高系統(tǒng)的穩(wěn)定性,降低并行開發(fā)引起的風(fēng)險,提高代碼的可讀性和可維護(hù)性。依賴倒置原則是JavaBean、EJB和COM等組件設(shè)計模型背后的基本原則。


????依賴倒置原則的本質(zhì)就是通過抽象(接口或抽象類)使各個類或模塊的實(shí)現(xiàn)彼此獨(dú)立,互不影響,實(shí)現(xiàn)模塊間的松耦合。在項目中使用這個原則只要遵循以下規(guī)則:

  • 每個類盡量都具有接口或抽象類,或者抽象類和接口兩者都具備。這是依賴倒置的基本要求,接口和抽象類都是抽象的,有了抽象才可能有依賴倒置;
  • 變量的表面類型盡量是接口或者抽象類;
  • 任何類都不應(yīng)該從具體類派生;
  • 盡量不要重寫基類的方法。如果基類是一個抽象類,而且這個方法已經(jīng)實(shí)現(xiàn)了,子類盡量不要重寫。類之間依賴的是抽象,重寫了非抽象方法,對依賴的穩(wěn)定性會產(chǎn)生一定的影響;
  • 結(jié)合里氏替換原則使用。里氏替換原則指出父類出現(xiàn)的地方子類就可以出現(xiàn),結(jié)合依賴倒置原則可以得出一個通俗的規(guī)則:接口負(fù)責(zé)定義抽象方法,并且聲明與其它對象的依賴關(guān)系,抽象類負(fù)責(zé)公共構(gòu)造部分的實(shí)現(xiàn),實(shí)現(xiàn)類準(zhǔn)確地實(shí)現(xiàn)業(yè)務(wù)邏輯,同時在適當(dāng)?shù)臅r候?qū)Ω割愡M(jìn)行細(xì)化。

4、接口隔離原則

接口隔離原則的具體含義如下:

  • 一個類對另外一個類的依賴性應(yīng)當(dāng)是建立在最小的接口上的。
  • 一個接口代表一個角色,不應(yīng)當(dāng)將不同的角色都交給一個接口。沒有關(guān)系的接口合并在一起,形成一個臃腫的大接口,這是對角色和接口的污染。因此使用多個專門接口比使用單一的接口要好。
  • 不應(yīng)該強(qiáng)迫客戶依賴于它們不用的方法。接口屬于客戶,不屬于它所在的類層次接口,即不要強(qiáng)迫客戶使用它們不用的方法,否則這些客戶就會面臨由于這些不使用的方法的改變所帶來的改變。

接口隔離原則是對接口的定義,同時是對類的定義,應(yīng)盡量使用原子接口或原子類,其中原子在實(shí)踐應(yīng)用中可以根據(jù)以下幾個規(guī)則來衡量:

  • 一個接口只對一個子模塊或者業(yè)務(wù)邏輯進(jìn)行服務(wù);
  • 只保留接口中業(yè)務(wù)邏輯需要的public方法;
  • 盡量修改污染了的接口,若修改的風(fēng)險較大,則可采用適配器模式進(jìn)行轉(zhuǎn)化處理;
  • 接口設(shè)計應(yīng)因項目而異,因環(huán)境而異,不能教條照搬。

迪米特法則

迪米特法則又叫最少知識原則(Least Knowledge Principle, LKP),意思是一個對象應(yīng)當(dāng)對其它對象盡可能少的了解。迪米特法則不同于其它的OO設(shè)計原則,它具有多種表述方式,其中具有代表性的是以下幾種表述:

  • 只與你直接的朋友們通信(Only talk to your immediate friends);
  • 不要跟陌生人說話(Don't talk to strangers);
  • 每一個軟件單位對其它軟件的單位都只有最少的了解,這些了解僅局限于那些與本單位密切相關(guān)的軟件單位。

開閉原則

開閉原則的原文是:

Software entities should be open for extensions,but close for modification.

????意思是:一個軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉。
這個原則說的是,在設(shè)計一個模塊的時候,應(yīng)當(dāng)使這個模塊可以在不被修改的前提下被擴(kuò)展,即應(yīng)當(dāng)可以在不必修改源代碼的情況下改變這個模塊的行為。
在面向?qū)ο蟮木幊讨校_閉原則是最基礎(chǔ)的原則,起到總得指導(dǎo)作用,其它原則(單一職責(zé)、里氏替換原則、依賴倒置、接口隔離、迪米特法則)都是開閉原則的具體形態(tài),即其它原則都是開閉原則的手段和工具。開閉原則的重要性可以通過以下幾個方面來體現(xiàn)。

  • 開閉原則提高復(fù)用性。
  • 開閉原則提高可維護(hù)性。
  • 開閉原則提高靈活性。
  • 開閉原則易于測試。

總結(jié)

  • 單一職責(zé)原則SRP(Single Responsibility Principle):一個類只有一個引起它變化的原因,應(yīng)該只有一個原則。
  • 里氏替換原則LSP(Liskov Substitution Principle): 所有引用基類的地方必須能透明的使用其子類對象,反之則不行。
  • 依賴倒置原則DIP(Dependence Inversion Principle): 高層模塊不應(yīng)依賴低層模塊,兩者都應(yīng)依賴其抽象,抽象不依賴細(xì)節(jié),而細(xì)節(jié)依賴抽象。
  • 接口隔離原則ISP(Interface Segregation Principle): 一個類對另外一個類的依賴性應(yīng)當(dāng)是建立在最小的接口上,使用多個專門的接口比使用單一的總接口要好;
  • “迪米特法則LoD(Law of Demeter): 一個對象應(yīng)該對其它對象有最少的了解,即一個類應(yīng)該對自己需要耦合或者調(diào)用的類知道得最少;
  • 開閉原則OCP(Open-Close Principle): 一個軟件實(shí)體類,如類,模塊和函數(shù)應(yīng)該對外擴(kuò)展開放,對修改關(guān)閉。

具體可參考書籍:《設(shè)計模式(Java版)》。


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

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄: 設(shè)計模式六大原則(1):單一職責(zé)原則 設(shè)計模式六大原則(2):里氏替換原則 設(shè)計模式六大原則(3):依賴倒...
    加油小杜閱讀 800評論 0 1
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計模式六...
    Bloo_m閱讀 799評論 0 7
  • 設(shè)計模式六大原則 設(shè)計模式六大原則(1):單一職責(zé)原則 定義:不要存在多于一個導(dǎo)致類變更的原因。通俗的說,即一個類...
    viva158閱讀 826評論 0 1
  • 1. 單一職責(zé)原則 Single Responsibility Principle,簡稱SRP. 這個設(shè)計原則備受...
    小菜_charry閱讀 234評論 0 0
  • 設(shè)計模式之六大原則(轉(zhuǎn)載) 關(guān)于設(shè)計模式的六大設(shè)計原則的資料網(wǎng)上很多...
    霄霄霄霄閱讀 948評論 0 1

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