設計模式設計原則

1、單一職責原則
2睡扬、里氏替換原則
3、依賴倒置原則
4黍析、接口隔離原則
5卖怜、迪米特原則
6、開閉原則

1阐枣、單一職責原則

定義職責原則定義:

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

????意思是:一個類马靠,應當只有一個引起它變化的原因;即一個類應該只有一個職責蔼两。
就一個類而言甩鳄,應該只專注于做一件事和僅有一個引起變化的原因,這就是所謂的單一職責原則额划。該原則提出了對對象職責的一種理想期望妙啃,對象不應該承擔太多的職責,正如人不應該一心分為二用俊戳。唯有專注揖赴,才能保證對象的高內聚;唯有單一抑胎,才能保證對象的細粒度燥滑。對象的高內聚與細粒度有利于對象的重用。一個龐大的對象承擔了太多的職責阿逃,當客戶端需用該對象的某一個職責時铭拧,就不得不將所有的職責都包含進來,進而造成冗余代碼恃锉。

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

  • 降低類的復雜性;
  • 提高類的可讀性;
  • 提高代碼的可維護性和復用性;
  • 降低因變更引起的風險羽历。

2、里氏替換原則

里氏替換原則定義:

在面向對象的語言中淡喜,繼承是必不可少的秕磷、優(yōu)秀的語言機制,它主要有以下幾個優(yōu)點:

  • 代碼共享炼团,較少創(chuàng)建類的工作量澎嚣,每個子類都擁有父類的方法和屬性疏尿;
  • 提高代碼的可重用性;
  • 提高代碼的可擴展性易桃;
  • 提高產品或項目的可開放性褥琐。

相應的,繼承也存在缺點晤郑,主要體現(xiàn)在以下幾個方面:

  • 繼承是入侵式的敌呈。只要繼承,就必須擁有父類的所有屬性和方法造寝。
  • 降低代碼的靈活性磕洪。子類必須擁有父類的屬性和方法,使子類受到限制诫龙。
  • 增強了耦合性析显。當父類的常量、變量和方法修改時签赃,必須考慮子類的修改谷异,這種修改可能造成大片的代碼需要重構。

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

  • 子類必須完全實現(xiàn)父類的方法歹嘹;
  • 子類可以有自己的個性;
  • 覆蓋或實現(xiàn)父類的方法時輸入參數(shù)可以被放大孔庭;
  • 覆蓋或實現(xiàn)父類的方法時輸出結果可以被縮小荞下。

在設計模式里體現(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.

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

  • 高層模塊不應該依賴低層模塊,兩者都依賴其抽象构资;
  • 抽象不依賴細節(jié)抽诉;
  • 細節(jié)應該依賴于抽象。

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

  • 模塊間的依賴通過抽象產生吐绵,實現(xiàn)類之間不發(fā)生直接的依賴關系迹淌,其依賴關系是通過接口或抽象類產生;
  • 接口或抽象類不依賴于實現(xiàn)類己单;
  • 實現(xiàn)類依賴于接口或抽象類唉窃。

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


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

  • 每個類盡量都具有接口或抽象類,或者抽象類和接口兩者都具備茉盏。這是依賴倒置的基本要求鉴未,接口和抽象類都是抽象的,有了抽象才可能有依賴倒置鸠姨;
  • 變量的表面類型盡量是接口或者抽象類铜秆;
  • 任何類都不應該從具體類派生;
  • 盡量不要重寫基類的方法享怀。如果基類是一個抽象類羽峰,而且這個方法已經實現(xiàn)了趟咆,子類盡量不要重寫添瓷。類之間依賴的是抽象,重寫了非抽象方法值纱,對依賴的穩(wěn)定性會產生一定的影響鳞贷;
  • 結合里氏替換原則使用。里氏替換原則指出父類出現(xiàn)的地方子類就可以出現(xiàn)虐唠,結合依賴倒置原則可以得出一個通俗的規(guī)則:接口負責定義抽象方法搀愧,并且聲明與其它對象的依賴關系,抽象類負責公共構造部分的實現(xiàn)疆偿,實現(xiàn)類準確地實現(xiàn)業(yè)務邏輯咱筛,同時在適當?shù)臅r候對父類進行細化。

4杆故、接口隔離原則

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

  • 一個類對另外一個類的依賴性應當是建立在最小的接口上的迅箩。
  • 一個接口代表一個角色,不應當將不同的角色都交給一個接口处铛。沒有關系的接口合并在一起饲趋,形成一個臃腫的大接口,這是對角色和接口的污染撤蟆。因此使用多個專門接口比使用單一的接口要好奕塑。
  • 不應該強迫客戶依賴于它們不用的方法。接口屬于客戶家肯,不屬于它所在的類層次接口龄砰,即不要強迫客戶使用它們不用的方法讨衣,否則這些客戶就會面臨由于這些不使用的方法的改變所帶來的改變寝贡。

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

  • 一個接口只對一個子模塊或者業(yè)務邏輯進行服務碟案;
  • 只保留接口中業(yè)務邏輯需要的public方法;
  • 盡量修改污染了的接口颇蜡,若修改的風險較大价说,則可采用適配器模式進行轉化處理;
  • 接口設計應因項目而異风秤,因環(huán)境而異鳖目,不能教條照搬。

迪米特法則

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

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

開閉原則

開閉原則的原文是:

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

????意思是:一個軟件實體應當對擴展開放尘喝,對修改關閉。
這個原則說的是斋陪,在設計一個模塊的時候朽褪,應當使這個模塊可以在不被修改的前提下被擴展,即應當可以在不必修改源代碼的情況下改變這個模塊的行為无虚。
在面向對象的編程中缔赠,開閉原則是最基礎的原則,起到總得指導作用友题,其它原則(單一職責嗤堰、里氏替換原則、依賴倒置咆爽、接口隔離梁棠、迪米特法則)都是開閉原則的具體形態(tài),即其它原則都是開閉原則的手段和工具斗埂。開閉原則的重要性可以通過以下幾個方面來體現(xiàn)符糊。

  • 開閉原則提高復用性。
  • 開閉原則提高可維護性呛凶。
  • 開閉原則提高靈活性男娄。
  • 開閉原則易于測試。

總結

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

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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末露氮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仇哆,更是在濱河造成了極大的恐慌沦辙,老刑警劉巖夫植,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讹剔,死亡現(xiàn)場離奇詭異,居然都是意外死亡详民,警方通過查閱死者的電腦和手機延欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沈跨,“玉大人由捎,你說我怎么就攤上這事《隽荩” “怎么了狞玛?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涧窒。 經常有香客問我心肪,道長,這世上最難降的妖魔是什么纠吴? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任硬鞍,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘固该。我一直安慰自己锅减,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布伐坏。 她就那樣靜靜地躺著怔匣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桦沉。 梳的紋絲不亂的頭發(fā)上劫狠,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音永部,去河邊找鬼独泞。 笑死,一個胖子當著我的面吹牛苔埋,可吹牛的內容都是我干的懦砂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼组橄,長吁一口氣:“原來是場噩夢啊……” “哼荞膘!你這毒婦竟也來了?” 一聲冷哼從身側響起玉工,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤羽资,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遵班,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屠升,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年狭郑,在試婚紗的時候發(fā)現(xiàn)自己被綠了腹暖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡翰萨,死狀恐怖脏答,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情亩鬼,我是刑警寧澤殖告,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站雳锋,受9級特大地震影響黄绩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜魄缚,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一宝与、第九天 我趴在偏房一處隱蔽的房頂上張望焚廊。 院中可真熱鬧,春花似錦习劫、人聲如沸咆瘟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袒餐。三九已至,卻和暖如春谤狡,著一層夾襖步出監(jiān)牢的瞬間灸眼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工墓懂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焰宣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓捕仔,卻偏偏與公主長得像匕积,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子榜跌,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • 目錄: 設計模式六大原則(1):單一職責原則 設計模式六大原則(2):里氏替換原則 設計模式六大原則(3):依賴倒...
    加油小杜閱讀 721評論 0 1
  • 轉載標注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設計模式六...
    Bloo_m閱讀 706評論 0 7
  • 設計模式六大原則 設計模式六大原則(1):單一職責原則 定義:不要存在多于一個導致類變更的原因闪唆。通俗的說,即一個類...
    viva158閱讀 763評論 0 1
  • 1. 單一職責原則 Single Responsibility Principle,簡稱SRP. 這個設計原則備受...
    小菜_charry閱讀 191評論 0 0
  • 設計模式之六大原則(轉載) 關于設計模式的六大設計原則的資料網上很多...
    霄霄霄霄閱讀 894評論 0 1