設(shè)計模式之六大設(shè)計原則整理

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

單一職責(zé)原則的英文名稱是Single Responsibility Principle,簡稱是SRP姓言。單一職責(zé)原則的定義是:應(yīng)該有且僅有一個原因引起類的變更随闺。
SRP的原話解釋是:
There should never be more than one reason for a class to change.
單一職責(zé)原則提出了一個編寫程序的標(biāo)準(zhǔn)卒废,用“職責(zé)”或“變化原因”來衡量接口或設(shè)計是否優(yōu)良里逆,但是“職責(zé)”跟“變化原因”都是不好度量的娇妓,要“因地制宜”。

單一職責(zé)適用于接口辫塌、類漏策,同時也適用于方法,也就是說臼氨,一個方法盡可能做一件事情掺喻,一般來說不應(yīng)該讓一個方法承擔(dān)多個職責(zé)。

2. 里氏替換原則

里氏替換原則為良好的繼承定義了一個規(guī)范储矩,一句簡單的定義包含了4層含義感耙。

1、子類必須完全實現(xiàn)父類的方法

2持隧、子類可以有自己的個性即硼。

3、覆蓋或?qū)崿F(xiàn)父類的方法時輸入?yún)?shù)可以被放大屡拨。

4只酥、覆寫或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小
即如果父類的一個方法的返回值是一個類型T,子類的相同方法(重載或覆寫)的返回值為S洁仗,那么里氏替換原則就要求S必須小于等于T层皱,也就是說,要么S和T是同一個類型赠潦,要么S是T的子類。

好像挺難理解的草冈,查找了一些資料她奥。著名技術(shù)作家Robert Martin在1996年為《C++ Reporter》寫了一篇題為《The The Liskov Substitution Principle》的文章,專門介紹LSP怎棱。在Martin的文章中哩俭,他給了LSP一個解釋:

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

意思是:“使用指向基類的指針或引用的函數(shù),必須能夠在不知道具體派生類對象類型的情況下使用它們拳恋》沧剩”在2002年,Martin在他出版的《Agile Software Development Principles Patterns and Practices》一書中谬运,又進一步簡化為:

Subtypes must be substitutable for their base types隙赁。子類必須能替換掉它們的父類。
這樣理解起來就比較順利了梆暖。

3. 依賴倒置

依賴倒置原則的原始定義是:

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)該依賴低層模塊伞访,兩者都應(yīng)該依賴其抽象;
  • 抽象不應(yīng)該依賴細(xì)節(jié);
  • 細(xì)節(jié)應(yīng)該依賴抽象轰驳。

這一原則在Java語言中的表現(xiàn)就是:
1厚掷、模塊間的依賴通過抽象發(fā)生弟灼,實現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系
是通過接口或抽象類產(chǎn)生的冒黑;
2田绑、接口或抽象類不依賴于實現(xiàn)類;
3抡爹、實現(xiàn)類依賴接口或抽象類掩驱。

一般抽象是不變的,而具體是易變的豁延。每個較高層次都為它所需要的服務(wù)聲明一個抽象接口昙篙,較低的層次實現(xiàn)這些抽象接口,每個高層類都通過該抽象接口使用下一層的服務(wù)诱咏,接口屬于高層,低層要實現(xiàn)高層的接口,因此現(xiàn)在是低層依賴于高層苔可。是依賴關(guān)系倒置和接口所有權(quán)的倒置。在周圍環(huán)境發(fā)生變化的時候袋狞,如果設(shè)計可以做到不怎么發(fā)生改變焚辅,那這樣的設(shè)計就是好的。

4. 接口隔離原則

接口隔離原則的原始定義是:

Clients should not be forced to depend upon interfaces that they don't use.
客戶端不應(yīng)該依賴它不需要的接口苟鸯。
The dependency of one class to another one should depend on the smallest possible interface.
類間的依賴關(guān)系應(yīng)該建立在最小的接口上同蜻。

這兩個定義概括起來就是,應(yīng)該盡量建立單一接口早处,不要建立臃腫的接口湾蔓,接口應(yīng)該盡量細(xì)化。

接口分離的手段主要有以下兩種:

  1. 委托分離砌梆,通過增加一個新的類型來委托客戶的請求默责,隔離客戶和接口的直接依賴,但會增加系統(tǒng)開銷咸包。
  2. 多重繼承分離桃序,通過接口多繼承來實現(xiàn)客戶需求。

5. 迪米特法則

迪米特法則(Law of Demeter)又叫最少知道原則(Least Knowledge Principle)烂瘫,1987年秋天由美國Northeastern University的Ian Holland提出媒熊,被UML的創(chuàng)始者之一Booch等普及。后來坟比,因為在經(jīng)典著作《 The Pragmatic Programmer》中提出而廣為人知芦鳍。

迪米特法則還有一個英文解釋是:Only talk to your immediate friends。

一個對象應(yīng)該對其他對象有最少的了解温算。通俗地講怜校,一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少。一個類公開的public屬性或方法越多注竿,修改時涉及的面也就越大茄茁,變更引起的風(fēng)險擴散也就越大魂贬。在設(shè)計時需要反復(fù)衡量,是否可以減少public方法和屬性裙顽,是否可以修改為private付燥、package-private、protected等訪問權(quán)限愈犹,是否可以加上final關(guān)鍵字等键科。迪米特法則要求類盡量不要對外公布太多的public方法和非靜態(tài)的public變量,盡量內(nèi)斂漩怎,多使用private勋颖、package-private、protected等訪問權(quán)限勋锤。

6. 開閉原則

開閉原則的定義:
Software entities like classes,modules and functios should be open for extemsion but closed for modifications.

一個軟件實體如類饭玲、模塊和函數(shù)應(yīng)該對擴展開放,對修改關(guān)閉叁执。一個軟件產(chǎn)品只要在生命期內(nèi)茄厘,都會發(fā)生變化,既然變化是一個既定的事實谈宛,我們應(yīng)該在設(shè)計時盡量適應(yīng)這些變化次哈,以提高項目的穩(wěn)定性和靈活性。開閉原則要求盡量通過擴展軟件實體的行為來實現(xiàn)變化吆录,而不是通過修改已有的代碼來完成變化窑滞。

如何做到開閉原則: 抽象、封裝恢筝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葛假,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滋恬,更是在濱河造成了極大的恐慌,老刑警劉巖抱究,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恢氯,死亡現(xiàn)場離奇詭異,居然都是意外死亡鼓寺,警方通過查閱死者的電腦和手機勋拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妈候,“玉大人敢靡,你說我怎么就攤上這事】嘁” “怎么了啸胧?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵赶站,是天一觀的道長。 經(jīng)常有香客問我纺念,道長贝椿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任陷谱,我火速辦了婚禮烙博,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烟逊。我一直安慰自己渣窜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布宪躯。 她就那樣靜靜地躺著乔宿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眷唉。 梳的紋絲不亂的頭發(fā)上予颤,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音冬阳,去河邊找鬼蛤虐。 笑死,一個胖子當(dāng)著我的面吹牛肝陪,可吹牛的內(nèi)容都是我干的驳庭。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼氯窍,長吁一口氣:“原來是場噩夢啊……” “哼饲常!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狼讨,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贝淤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后政供,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體播聪,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年布隔,在試婚紗的時候發(fā)現(xiàn)自己被綠了离陶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡衅檀,死狀恐怖招刨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哀军,我是刑警寧澤沉眶,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布打却,位于F島的核電站,受9級特大地震影響沦寂,放射性物質(zhì)發(fā)生泄漏学密。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一传藏、第九天 我趴在偏房一處隱蔽的房頂上張望腻暮。 院中可真熱鬧,春花似錦毯侦、人聲如沸哭靖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽试幽。三九已至,卻和暖如春卦碾,著一層夾襖步出監(jiān)牢的瞬間铺坞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工洲胖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留济榨,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓绿映,卻偏偏與公主長得像擒滑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叉弦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 整理總結(jié)自《設(shè)計模式之禪》一書 1 單一職責(zé)原則 Single Responsibility Principle ...
    笑哥哥閱讀 439評論 0 1
  • 1丐一、單一職責(zé)原則2、里氏替換原則3淹冰、依賴倒置原則4库车、接口隔離原則5、迪米特原則6樱拴、開閉原則 1凝颇、單一職責(zé)原則 定義...
    安靜點就睡吧閱讀 387評論 0 1
  • 目錄: 設(shè)計模式六大原則(1):單一職責(zé)原則 設(shè)計模式六大原則(2):里氏替換原則 設(shè)計模式六大原則(3):依賴倒...
    加油小杜閱讀 724評論 0 1
  • 對比是我們每個人都有的一種習(xí)慣,有的人把這種習(xí)慣進行了升級疹鳄,就成為了攀比。大多數(shù)人其實并沒有特別強的攀比心理芦岂,但是...
    善行無痕閱讀 215評論 0 0
  • 大概沒有人會想到這場一開始注定要持續(xù)至少三個月的苦逼深山生活禽最,竟然因為一場地震變成了為期半個月的生死旅游腺怯。北京時間...
    想吃熱豆腐的心急boy閱讀 502評論 4 1