《設(shè)計模式之禪》讀書筆記-1.0-六大設(shè)計原則

1.1 單一職責(zé)原則

Single Responsibility Principle

建議:

接口一定要做到單一職責(zé)床绪,類的設(shè)計盡量做到只有一個原因引起變化

1.2 里氏替換原則

Liskov Substitution Pronciple

定義:

只要父類能出現(xiàn)的地方子類就可以出現(xiàn)袖裕,而且替換為子類也不會產(chǎn)生任何錯誤或異常。

規(guī)范:

  1. 子類必須完全實現(xiàn)父類的方法
  2. 子類可以有自己的個性
  3. 覆蓋或?qū)崿F(xiàn)父類的方法時輸入?yún)?shù)可以被放大
>參數(shù)不同相當(dāng)于重載诱担,不是覆寫污秆。    
子類的參數(shù)范圍如果比父類小毒费,子類在沒有覆寫父類方法的前提下(將父類換為子類),子類方法可以被執(zhí)行
  1. 覆寫或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小
>如果是覆寫凡蜻,子類的輸出結(jié)果應(yīng) <= 父類的輸出結(jié)果
如果是重載搭综,要求子類的輸入?yún)?shù)寬于或等于父類的輸入?yún)?shù),也就是當(dāng)將用父類的地方換為子類划栓。這個方法也不會被調(diào)用设凹。

建議:

采用里氏替換時,盡量避免子類的“個性”茅姜,一旦子類有“個性”闪朱,這個子類和父類之間的關(guān)系就很難調(diào)和了,把子類當(dāng)做父類使用钻洒,自樂你的“個性”被抹殺——委屈了點奋姿;把子類單獨作為一個業(yè)務(wù)來使用,則會讓代碼見的耦合關(guān)系變得撲朔迷迷離——缺乏類替換的標(biāo)準(zhǔn)素标。

1.3 依賴倒置原則

Dependence Inversioin Principle

含義:

  1. 高層模塊不應(yīng)該依賴低層模塊称诗,兩者都應(yīng)該依賴其抽象
  2. 抽象不應(yīng)該依賴細(xì)節(jié)
  3. 細(xì)節(jié)應(yīng)該依賴抽象

抽象:接口或抽象類。 細(xì)節(jié):實現(xiàn)類

依賴的三種寫法:
1头遭、構(gòu)造函數(shù)傳遞依賴對象
2寓免、Setter方法傳遞依賴對象
3、接口聲明依賴對象

建議:

依賴倒置原則的本質(zhì)就是通過抽象(接口或抽象類)使個各類或模塊的實現(xiàn)彼此獨立计维,互不影響袜香,實現(xiàn)模塊間的松耦合。

  1. 每個類盡量都有接口或抽象類鲫惶,或者抽象類和接口

    基本要求蜈首,接口和抽象類都是屬于抽象的,有了抽象才可能依賴倒置

  2. 變量的表面類型盡量是接口或者抽象類

    注意Utils工具類和 java實現(xiàn)類的clone方法

  3. 任何類都不應(yīng)該從具體類派生

    類的繼承層數(shù)盡量少

  4. 盡量不要覆寫基類的方法

    如果基類是一個抽象類欠母,而且這個方法已經(jīng)實現(xiàn)了欢策,子類盡量不要再覆寫。類間的依賴是抽象赏淌,覆寫了抽象類的具體方法踩寇,對依賴的穩(wěn)定性會有一定影響。

  5. 結(jié)合里氏替換原則使用

    規(guī)則:接口負(fù)責(zé)定義public屬性和方法六水,并且聲明與其他對象的依賴關(guān)系俺孙,抽象類負(fù)責(zé)公共構(gòu)造部分的實現(xiàn),實現(xiàn)類準(zhǔn)確的實現(xiàn)業(yè)務(wù)邏輯缩擂,同時在適當(dāng)?shù)臅r候?qū)Ω割愡M(jìn)行細(xì)化

1.4鼠冕、接口隔離原則

Interface Segregation Principle

Java接口的種類:

  1. 實例接口(Object Interface):Person zhangSan = new Person(); Person類就是zhangSan的接口
  2. 類接口(Class Interface):用interface定義的接口

定義:

  1. 第1種:客戶端不應(yīng)該依賴它不需要的接口
  2. 第2種:類間的依賴關(guān)系應(yīng)該建立在最小的接口上

概括:

接口盡量細(xì)化胯盯,同時接口中的方法盡量減少懈费。與單一職責(zé)的區(qū)別:審視角度不同,單一職責(zé)要求的是類和接口職責(zé)單一博脑,注重的職責(zé)憎乙,這是業(yè)務(wù)邏輯上的劃分票罐;接口隔離要求接口方法盡量少。職責(zé)相同泞边,訪問模塊不同:盡量使用多個專門的接口该押,每個不同模塊對應(yīng)不同的接口。

建議:

  1. 一個接口只服務(wù)于一個子模塊或業(yè)務(wù)邏輯
  2. 通過業(yè)務(wù)邏輯壓縮接口中的public方法阵谚,接口時常去回顧蚕礼,盡量讓接口達(dá)到“滿身筋骨肉”,而不是“肥嘟嘟”的一大堆方法
  3. 已經(jīng)被污染了的接口梢什,盡量去修改奠蹬,若變更風(fēng)險較大,則采取適配器模式進(jìn)行轉(zhuǎn)化處理嗡午。
  4. 了解環(huán)境囤躁,拒絕盲從。

根據(jù)經(jīng)驗和常識決定接口的粒度大小荔睹,接口粒度太小狸演,導(dǎo)致接口數(shù)據(jù)劇增,開發(fā)人員嗆死在接口的海洋里僻他;接口粒度太大宵距,靈活性降低,無法提供定制服務(wù)中姜,給整個項目帶來無法預(yù)料的風(fēng)險消玄。

1.5、迪米特法則

Law of Demeter 丢胚,也稱為最少知識原則(Least Knowedge Principle)

定義:

一個對象應(yīng)該對其他對象有最少的了解。通俗地講受扳,一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少

四層含義:

  1. 只和朋友交流
  2. 朋友間也是有距離的
  3. 是自己的就是自己的

    有這樣一個方法:放在本類中可以携龟,放在其他類中也沒錯,那怎么去衡量呢勘高?
    如果一個方法放在本類中峡蟋,既不增加類間關(guān)系,也對本類不產(chǎn)生負(fù)面影響华望,那就放在本類中蕊蝗。

  4. 謹(jǐn)慎使用Serializable

    VO:value object

建議:

  1. 迪米特法則的核心觀念就是類間的解耦,弱耦合赖舟,只有弱耦合后蓬戚,類的復(fù)用率才可以提高。其要求的結(jié)果就是產(chǎn)生了大量的中轉(zhuǎn)或跳轉(zhuǎn)類宾抓,導(dǎo)致系統(tǒng)復(fù)雜性提高子漩。
  2. 在實際應(yīng)用中豫喧,如果一個類跳轉(zhuǎn)兩次以上高才能訪問到另一個類,就需要進(jìn)行重構(gòu)了幢泼。因為一個系統(tǒng)的成功不僅僅是一個標(biāo)準(zhǔn)或是原則就能夠決定的紧显,有非常多的因素。跳轉(zhuǎn)次數(shù)越多缕棵,系統(tǒng)越復(fù)雜孵班,維護就越困難,所以只要跳轉(zhuǎn)不超過兩次都是可以忍受的
  3. 迪米特法則要求類間的解耦招驴,但解耦是有限度的重父。

1.6、開閉原則

Open Closed Principle

定義:

一個軟件實體忽匈,如類房午、模塊和函數(shù) 應(yīng)該對擴展開發(fā),對修改關(guān)閉

如何使用:

** 1. 抽象約束 **
抽象是對一組事物的通用描述丹允,沒有具體的實現(xiàn)郭厌,也就表示它可以有非常多的可能性,可以跟隨需求的變化而變化雕蔽。因此折柠,通過接口或抽象類可以約束一組可能變化的行為,并且能夠?qū)崿F(xiàn)對擴展開放批狐。其包含三層含義:

1.1. 通過接口或抽象類約束擴展扇售,對擴展進(jìn)行邊界限定,不允許出現(xiàn)在接口或抽象類中不存在的public方法嚣艇;
1.2.參數(shù)類型承冰、引用對象盡量使用接口或抽象類,而不是實現(xiàn)類食零;
1.3.抽象層盡量保持穩(wěn)定困乒,一旦確定即不允許修改。

** 2. 元數(shù)據(jù)控制模塊行為 **

元數(shù)據(jù):用來描述環(huán)境和數(shù)據(jù)的數(shù)據(jù)贰谣,通俗地說就是配置參數(shù)娜搂。參數(shù)可以從文件中獲得,也可以從數(shù)據(jù)庫中獲得

** 3. 指定項目章程 **

約定優(yōu)于配置

** 4. 封裝變化 **

  • a吱抚、將相同的變化封裝到一個接口或抽象類中
  • b百宇、將不同的變化封裝到不同的接口或抽象類中,不應(yīng)該有兩個不同的變化出現(xiàn)在同一個接口或抽象類中秘豹。
  • 封裝變化:也就是受保護的變化(protected variations)携御,找出預(yù)計有變化或不穩(wěn)定的點,我們?yōu)檫@些變化點創(chuàng)建穩(wěn)定的接口,準(zhǔn)確地講是封裝可能發(fā)生的變化因痛,一旦預(yù)測到有變化婚苹,就可以進(jìn)行封裝。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸵膏,一起剝皮案震驚了整個濱河市膊升,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谭企,老刑警劉巖廓译,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異债查,居然都是意外死亡非区,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門盹廷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來征绸,“玉大人,你說我怎么就攤上這事俄占」艿。” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵缸榄,是天一觀的道長渤弛。 經(jīng)常有香客問我,道長甚带,這世上最難降的妖魔是什么她肯? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鹰贵,結(jié)果婚禮上晴氨,老公的妹妹穿的比我還像新娘。我一直安慰自己砾莱,他們只是感情好瑞筐,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腊瑟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪块蚌。 梳的紋絲不亂的頭發(fā)上闰非,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音峭范,去河邊找鬼财松。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辆毡。 我是一名探鬼主播菜秦,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舶掖!你這毒婦竟也來了球昨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤眨攘,失蹤者是張志新(化名)和其女友劉穎主慰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲫售,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡共螺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了情竹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藐不。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秦效,靈堂內(nèi)的尸體忽然破棺而出雏蛮,到底是詐尸還是另有隱情,我是刑警寧澤棉安,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布底扳,位于F島的核電站,受9級特大地震影響贡耽,放射性物質(zhì)發(fā)生泄漏衷模。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一蒲赂、第九天 我趴在偏房一處隱蔽的房頂上張望阱冶。 院中可真熱鬧,春花似錦滥嘴、人聲如沸木蹬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镊叁。三九已至,卻和暖如春走触,著一層夾襖步出監(jiān)牢的瞬間晦譬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工互广, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敛腌,地道東北人卧土。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像像樊,于是被迫代替她去往敵國和親尤莺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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