設(shè)計模式

設(shè)計模式

設(shè)計模式的本質(zhì)是面向?qū)ο笤O(shè)計原則的實際運用捉兴,是對類的封裝性鄙才、繼承性和多態(tài)性以及類的關(guān)聯(lián)關(guān)系和組合關(guān)系的充分理解。

六大原則

  • 單一職責原則(Single Responsibility Principle撕瞧,SRP)
  • 里式替換原則(Liskov Substitution Principle于样,LSP)
  • 依賴倒置原則(Dependence Inversion Principle屡律,DIP)
  • 接口隔離原則(Interface Segregation Principle挪圾,ISP)
  • 迪米特法則(Law of Demeter,LoD),又稱最少知識原(Least Knowledge Principle国拇,LKP)
  • 開閉原則(Open Closed Principle洛史,OCP)

單一原則

單一職責原則要求一個接口或類只有一個原因引起變化,也就是說一個接口或一個類只有一個原則酱吝,它就只負責一件事也殖。

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

不使用單一原則可能存在哪些問題

  • 一個職責的變化可能會削弱或者抑制這個類實現(xiàn)其他職責的能力;
  • 當客戶端需要該對象的某一個職責時务热,不得不將其他不需要的職責全都包含進來忆嗜,從而造成冗余代碼或代碼的浪費。

單一原則的優(yōu)點:

  • 類的復雜性降低崎岂,實現(xiàn)什么職責都有清晰明確的定義捆毫;
  • 可讀性提高,復雜性降低冲甘,那當然可讀性提高了绩卤;
  • 可維護性提高,那當然了江醇,可讀性提高濒憋,那當然更容易維護了;
  • 變更引起的風險降低陶夜,變更是必不可少的凛驮,如果接口的單一職責做得好,一個接口修改只對相應的實現(xiàn)類有影響条辟,對其他的接口無影響黔夭,這對系統(tǒng)的擴展性、維護性都有非常大幫助羽嫡。

里氏替換原則

繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立

Inheritance should ensure that any property proved about supertype objects also holds for subtype objects

里氏替換原則通俗來講就是:子類可以擴展父類的功能本姥,但不能改變父類原有的功能。也就是說:子類繼承父類時杭棵,除添加新的方法完成新增功能外扣草,盡量不要重寫父類的方法。

里氏替換原則的優(yōu)點:

  • 里氏替換原則是實現(xiàn)開閉原則的重要方式之一颜屠。
  • 它克服了繼承中重寫父類造成的可復用性變差的缺點。
  • 它是動作正確性的保證鹰祸。即類的擴展不會給已有的系統(tǒng)引入新的錯誤甫窟,降低了代碼出錯的可能性。
  • 加強程序的健壯性蛙婴,同時變更時可以做到非常好的兼容性粗井,提高程序的維護性、可擴展性,降低需求變更時引入的風險浇衬。

實現(xiàn)方法:

  • 子類可以實現(xiàn)父類的抽象方法懒构,但不能覆蓋父類的非抽象方法
  • 子類中可以增加自己特有的方法
  • 當子類的方法重載父類的方法時,方法的前置條件(即方法的輸入?yún)?shù))要比父類的方法更寬松
  • 當子類的方法實現(xiàn)父類的方法時(重寫/重載或?qū)崿F(xiàn)抽象方法)耘擂,方法的后置條件(即方法的的輸出/返回值)要比父類的方法更嚴格或相等

依賴倒置原則

高層模塊不應該依賴低層模塊胆剧,兩者都應該依賴其抽象;抽象不應該依賴細節(jié)醉冤,細節(jié)應該依賴抽象

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

要面向接口編程秩霍,不要面向?qū)崿F(xiàn)編程。

依賴倒置原則是實現(xiàn)開閉原則的重要途徑之一蚁阳,它降低了客戶與實現(xiàn)模塊之間的耦合铃绒。

依賴倒置原則的優(yōu)點:

  • 依賴倒置原則可以降低類間的耦合性。
  • 依賴倒置原則可以提高系統(tǒng)的穩(wěn)定性螺捐。
  • 依賴倒置原則可以減少并行開發(fā)引起的風險颠悬。
  • 依賴倒置原則可以提高代碼的可讀性和可維護性。

實現(xiàn)方法:

依賴倒置原則的目的是通過要面向接口的編程來降低類間的耦合性

  • 每個類盡量提供接口或抽象類定血,或者兩者都具備赔癌。
  • 變量的聲明類型盡量是接口或者是抽象類。
  • 任何類都不應該從具體類派生糠悼。
  • 使用繼承時盡量遵循里氏替換原則届榄。

接口隔離原則:

客戶端不應該被迫依賴于它不使用的方法
Clients should not be forced to depend on methods they do not use

一個類對另一個類的依賴應該建立在最小的接口上
The dependency of one class to another one should depend on the smallest possible interface

接口隔離原則的優(yōu)點:

  • 將臃腫龐大的接口分解為多個粒度小的接口,可以預防外來變更的擴散倔喂,提高系統(tǒng)的靈活性和可維護性铝条。
  • 接口隔離提高了系統(tǒng)的內(nèi)聚性,減少了對外交互席噩,降低了系統(tǒng)的耦合性班缰。
  • 如果接口的粒度大小定義合理,能夠保證系統(tǒng)的穩(wěn)定性悼枢;但是埠忘,如果定義過小,則會造成接口數(shù)量過多馒索,使設(shè)計復雜化莹妒;如果定義太大,靈活性降低绰上,無法提供定制服務旨怠,給整體項目帶來無法預料的風險。
  • 使用多個專門的接口還能夠體現(xiàn)對象的層次蜈块,因為可以通過接口的繼承鉴腻,實現(xiàn)對總接口的定義迷扇。
  • 能減少項目工程中的代碼冗余。過大的大接口里面通常放置許多不用的方法爽哎,當實現(xiàn)這個接口的時候蜓席,被迫設(shè)計冗余的代碼。

接口隔離原則和單一原則的區(qū)別:

接口隔離原則和單一職責都是為了提高類的內(nèi)聚性课锌、降低它們之間的耦合性厨内,體現(xiàn)了封裝的思想,但兩者是不同的:

  • 單一職責原則注重的是職責产镐,而接口隔離原則注重的是對接口依賴的隔離隘庄。
  • 單一職責原則主要是約束類,它針對的是程序中的實現(xiàn)和細節(jié)癣亚;接口隔離原則主要約束接口丑掺,主要針對抽象和程序整體框架的構(gòu)建。

實現(xiàn)方法:

  • 接口盡量小述雾,但是要有限度街州。一個接口只服務于一個子模塊或業(yè)務邏輯。
  • 為依賴接口的類定制服務玻孟。只提供調(diào)用者需要的方法唆缴,屏蔽不需要的方法。
  • 了解環(huán)境黍翎,拒絕盲從面徽。每個項目或產(chǎn)品都有選定的環(huán)境因素,環(huán)境不同匣掸,接口拆分的標準就不同深入了解業(yè)務邏輯趟紊。
  • 提高內(nèi)聚,減少對外交互碰酝。使接口用最少的方法去完成最多的事情霎匈。

迪米特法則

只與你的直接朋友交談,不跟“陌生人”說話
Talk only to your immediate friends and not to strangers

如果兩個軟件實體無須直接通信送爸,那么就不應當發(fā)生直接的相互調(diào)用铛嘱,可以通過第三方轉(zhuǎn)發(fā)該調(diào)用。其目的是降低類之間的耦合度袭厂,提高模塊的相對獨立性墨吓。

“朋友”是指:當前對象本身、當前對象的成員對象纹磺、當前對象所創(chuàng)建的對象肛真、當前對象的方法參數(shù)等,這些對象同當前對象存在關(guān)聯(lián)爽航、聚合或組合關(guān)系蚓让,可以直接訪問這些對象的方法。

迪米特法則的優(yōu)點:

  • 降低了類之間的耦合度讥珍,提高了模塊的相對獨立性历极。
  • 由于親合度降低,從而提高了類的可復用率和系統(tǒng)的擴展性衷佃。

注意:過度使用迪米特法則會使系統(tǒng)產(chǎn)生大量的中介類趟卸,從而增加系統(tǒng)的復雜性,使模塊之間的通信效率降低氏义。所以锄列,在釆用迪米特法則時需要反復權(quán)衡,確保高內(nèi)聚和低耦合的同時惯悠,保證系統(tǒng)的結(jié)構(gòu)清晰邻邮。

實現(xiàn)方法:

  • 在類的劃分上,應該創(chuàng)建弱耦合的類克婶。類與類之間的耦合越弱筒严,就越有利于實現(xiàn)可復用的目標。
  • 在類的結(jié)構(gòu)設(shè)計上情萤,盡量降低類成員的訪問權(quán)限鸭蛙。
  • 在類的設(shè)計上,優(yōu)先考慮將一個類設(shè)置成不變類筋岛。
  • 在對其他類的引用上娶视,將引用其他對象的次數(shù)降到最低。
  • 不暴露類的屬性成員睁宰,而應該提供相應的訪問器(set 和 get 方法)肪获。
  • 謹慎使用序列化(Serializable)功能。

開閉原則

軟件實體應當對擴展開放勋陪,對修改關(guān)閉
Software entities should be open for extension贪磺,but closed for modification

當應用的需求改變時,在不修改軟件實體的源代碼或者二進制代碼的前提下诅愚,可以擴展模塊的功能寒锚,使其滿足新的需求。

開閉原則的優(yōu)點:

  • 對軟件測試的影響违孝,軟件遵守開閉原則的話刹前,軟件測試時只需要對擴展的代碼進行測試就可以了,因為原有的測試代碼仍然能夠正常運行雌桑。
  • 可以提高代碼的可復用性喇喉,粒度越小,被復用的可能性就越大校坑;在面向?qū)ο蟮某绦蛟O(shè)計中拣技,根據(jù)原子和抽象編程可以提高代碼的可復用性千诬。
  • 可以提高軟件的可維護性,遵守開閉原則的軟件膏斤,其穩(wěn)定性高和延續(xù)性強徐绑,從而易于擴展和維護。

實現(xiàn)方法:

抽象約束莫辨、封裝變化

通過接口或者抽象類為軟件實體定義一個相對穩(wěn)定的抽象層傲茄,而將相同的可變因素封裝在相同的具體實現(xiàn)類中。

參考資料:

http://c.biancheng.net/view/1327.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沮榜,一起剝皮案震驚了整個濱河市盘榨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟆融,老刑警劉巖草巡,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異振愿,居然都是意外死亡捷犹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門冕末,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萍歉,“玉大人,你說我怎么就攤上這事档桃∏购ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵藻肄,是天一觀的道長蔑舞。 經(jīng)常有香客問我,道長嘹屯,這世上最難降的妖魔是什么攻询? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮州弟,結(jié)果婚禮上钧栖,老公的妹妹穿的比我還像新娘。我一直安慰自己婆翔,他們只是感情好拯杠,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啃奴,像睡著了一般潭陪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天依溯,我揣著相機與錄音老厌,去河邊找鬼。 笑死黎炉,一個胖子當著我的面吹牛梅桩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拜隧,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趁仙!你這毒婦竟也來了洪添?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雀费,失蹤者是張志新(化名)和其女友劉穎干奢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盏袄,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡忿峻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辕羽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逛尚。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刁愿,靈堂內(nèi)的尸體忽然破棺而出绰寞,到底是詐尸還是另有隱情,我是刑警寧澤铣口,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布滤钱,位于F島的核電站,受9級特大地震影響脑题,放射性物質(zhì)發(fā)生泄漏件缸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一叔遂、第九天 我趴在偏房一處隱蔽的房頂上張望他炊。 院中可真熱鬧,春花似錦掏熬、人聲如沸佑稠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舌胶。三九已至,卻和暖如春疮丛,著一層夾襖步出監(jiān)牢的瞬間幔嫂,已是汗流浹背辆它。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留履恩,地道東北人锰茉。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像切心,于是被迫代替她去往敵國和親飒筑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355