設(shè)計(jì)模式的原則

現(xiàn)在編程的主流語(yǔ)言基本上都是面向?qū)ο蟮钠TH鏑#,C++早处,JAVA湾蔓。我們?cè)谑褂脮r(shí),已經(jīng)構(gòu)造了一個(gè)個(gè)的類(lèi)砌梆。但是往往由于我們?cè)陬?lèi)內(nèi)部或外部的設(shè)計(jì)上存在種種問(wèn)題默责,導(dǎo)致盡管是面向?qū)ο蟮恼Z(yǔ)言,卻是面向過(guò)程的邏輯咸包,甚至維護(hù)起來(lái)異常困難桃序。每次增加或修改功能都要改動(dòng)很多的代碼,如履薄冰诉儒。而面向?qū)ο蟮牧笤瓌t主要的目的葡缰,就是我們?nèi)绾卧O(shè)計(jì)類(lèi),更能很好的利用面向?qū)ο蟮奶匦浴?br>

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

一個(gè)類(lèi)永遠(yuǎn)只有一個(gè)職責(zé)忱反。

一套軟件就像是一個(gè)團(tuán)隊(duì)泛释,每個(gè)類(lèi)就是團(tuán)隊(duì)中的一個(gè)成員。團(tuán)隊(duì)如果想穩(wěn)定的發(fā)展温算。這些類(lèi)就要各司其職怜校,分工明確。如果類(lèi)之間的功能出現(xiàn)了混淆注竿,那么軟件的整體結(jié)構(gòu)就會(huì)非常的混亂茄茁。就像管理學(xué)中的一句話(huà),如果一個(gè)職責(zé)由每個(gè)員工負(fù)責(zé)巩割,那么這個(gè)職責(zé)就沒(méi)有員工在負(fù)責(zé)裙顽。 這個(gè)原則的概念非常簡(jiǎn)單,也是非承福基礎(chǔ)的愈犹。很多人盡管沒(méi)有學(xué)習(xí)過(guò)面向?qū)ο蟮乃枷耄墙?jīng)常寫(xiě)代碼之后也會(huì)不自覺(jué)的遵守這個(gè)原則。 Ps:在遵循單一職責(zé)原則的時(shí)候漩怎,常常會(huì)遇到職責(zé)擴(kuò)散的問(wèn)題勋颖。什么是職責(zé)擴(kuò)散呢?這里簡(jiǎn)單說(shuō)下勋锤,在日志生活中饭玲,我們?cè)诜诸?lèi)職責(zé)時(shí),發(fā)現(xiàn)很多平常不受重視的職責(zé)叁执,但是這些職責(zé)又不能忽視茄厘。于是就依次累加,最后分起類(lèi)來(lái)會(huì)無(wú)窮無(wú)盡(有興趣的讀者可以參考下長(zhǎng)尾定理)谈宛。為了解決這種問(wèn)題蚕断,我們就需要有一些類(lèi),他的職責(zé)比較綜合(類(lèi)似于“其它”)入挣。類(lèi)似于一個(gè)幫助類(lèi)亿乳。但是這個(gè)類(lèi)又不能太復(fù)雜了,否則我們就應(yīng)該考慮怎么把這個(gè)類(lèi)分離開(kāi)來(lái)径筏。究竟這個(gè)類(lèi)的復(fù)雜程度到了什么時(shí)候情況下葛假,我們就應(yīng)該拆分呢?這個(gè)需要程序員根據(jù)軟件自身的復(fù)雜情況來(lái)判斷滋恬,沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)聊训。

2) 里氏替換原則

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

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

這個(gè)原則主要是為了體現(xiàn)面向?qū)ο蟮摹袄^承”特征來(lái)提出的。 它的主旨就是恢氯,能夠使用基類(lèi)的地方带斑,必然也能夠透明的使用其子類(lèi),并且保證不會(huì)出錯(cuò)勋拟。為了保證這種透明的無(wú)差別的使用勋磕,子類(lèi)在使用時(shí)不應(yīng)該隨意的重寫(xiě)父類(lèi)已經(jīng)定義好的非抽象的方法。因?yàn)檫@些非抽象方法敢靡,類(lèi)似于某種職能或契約挂滓,當(dāng)父類(lèi)保持這種約定時(shí),子類(lèi)也應(yīng)該遵循并保證該特性啸胧,而非修改該特性赶站。 我們?cè)趯?xiě)代碼的時(shí)候,如果一個(gè)參數(shù)設(shè)定的是基類(lèi)(或接口纺念、抽象類(lèi))贝椿,那么我們傳送子類(lèi)進(jìn)去,一樣可以正常使用陷谱。因?yàn)榛?lèi)相對(duì)于父類(lèi)烙博,只是一個(gè)更豐富,更具體,更詳細(xì)的表現(xiàn)形式习勤。而不應(yīng)該出現(xiàn),傳入父類(lèi)運(yùn)行某種方法沒(méi)有問(wèn)題焙格,可是傳入子類(lèi)運(yùn)行時(shí)就報(bào)錯(cuò)了图毕。這在日常生活中也可以理解,汽車(chē)作為父類(lèi)眷唉,他下面有卡車(chē)予颤、轎車(chē)。轎車(chē)下邊又有兩廂冬阳,三廂等不同的繼承蛤虐。但是無(wú)論是哪種汽車(chē)(父類(lèi))的職能,對(duì)于他的子類(lèi)(卡車(chē)或轎車(chē))都應(yīng)該具有相同的職能肝陪,而不是相反的職能驳庭。以至于子類(lèi)的子類(lèi)(本例中是兩廂轎車(chē))也應(yīng)該擁有汽車(chē)一致的功能。

我們?cè)趯?xiě)代碼中氯窍,很容易出現(xiàn)復(fù)寫(xiě)了父類(lèi)的方法后饲常,父類(lèi)的方法發(fā)生了改動(dòng),而未考慮到子類(lèi)的方法也需要作出相應(yīng)的改動(dòng)狼讨,導(dǎo)致代碼出現(xiàn)錯(cuò)誤贝淤。 通俗一點(diǎn),可以理解為子類(lèi)是遺傳自父類(lèi)的政供。他在各種職能上也應(yīng)該一脈相承自父類(lèi)播聪。而不應(yīng)該隨意改變。

Ps 為什么要叫里氏替換原則呢布隔?這是因?yàn)樽钤缣岢鲞@個(gè)理論的人姓里L(fēng)iskov离陶。這是計(jì)算機(jī)中少有的以姓氏命名的東西。

3)最少知道原則

Only talk to your immediate friends衅檀。(已經(jīng)第二次引用英文枕磁,是不是很厲害23333)

永遠(yuǎn)只和你的朋友交流。

我們?cè)趯W(xué)習(xí)編程的初期术吝,都會(huì)有人告訴我們要遵循“高內(nèi)聚计济,低耦合”。而OO中也將“封裝”作為對(duì)象的基本特征之一排苍。最少知道原則其實(shí)體現(xiàn)的就是“高內(nèi)聚沦寂,低耦合”這句話(huà)。

(1)低耦合:一個(gè)類(lèi)對(duì)于自己依賴(lài)的類(lèi)淘衙,知道的越少越好传藏。不要讓一個(gè)類(lèi)依賴(lài)過(guò)多的類(lèi)。否則這個(gè)類(lèi)很容受外界的影響,并且因?yàn)檫@種影響要改變自身的代碼(自身要適應(yīng))毯侦。

(2)高內(nèi)聚:將實(shí)現(xiàn)邏輯都封裝在類(lèi)的內(nèi)部哭靖,對(duì)public方法以外的信息,不輕易暴露給外界侈离。這是由于public對(duì)外后试幽,相當(dāng)于是一種契約,一種許諾卦碾。你要再后邊的實(shí)現(xiàn)中铺坞,不斷的去兼容這種public,以防止調(diào)用它的代碼不會(huì)報(bào)錯(cuò)洲胖。 上面這樣說(shuō)济榨,可能有點(diǎn)抽象,這里舉個(gè)例子绿映。在很多人對(duì)另一方的要求擒滑,都有一條,社會(huì)關(guān)系不要復(fù)雜叉弦。為什么會(huì)這樣呢橘忱?因?yàn)橐粋€(gè)人如果他和外界的關(guān)系越復(fù)雜,他就越不穩(wěn)定卸奉,不怕人找事钝诚,就怕事找人¢茫或許他的本性是好的凝颇,但是周邊的龍魚(yú)混雜,三天兩頭的總會(huì)有事疹鳄。避免這種問(wèn)題的最好辦法拧略,就是一開(kāi)始就做一個(gè)安靜的美男子。

4)接口隔離原則

一個(gè)類(lèi)對(duì)于另外一個(gè)類(lèi)的依賴(lài)應(yīng)該建立在最小的接口上瘪弓。

一個(gè)接口定義的過(guò)于臃腫垫蛆,則代表他的每一個(gè)實(shí)現(xiàn)類(lèi)都要考慮所有的實(shí)現(xiàn)邏輯。如果一個(gè)類(lèi)實(shí)現(xiàn)了某個(gè)接口腺怯,也就是說(shuō)這個(gè)類(lèi)承載了這個(gè)接口所有的功能袱饭,維護(hù)這些功能成為了自己的職責(zé)。這就無(wú)形中增加了一個(gè)類(lèi)的負(fù)擔(dān)呛占。

這里有兩點(diǎn)需要說(shuō)明一下:

(1)接口定義的小虑乖,但是要有限度。對(duì)接口細(xì)化可以增加靈活性晾虑,但是過(guò)度細(xì)化則會(huì)使設(shè)計(jì)復(fù)雜化疹味。同時(shí)接口的使用率不高仅叫,提高了代碼的維護(hù)成本。這種極端的體現(xiàn)就是每個(gè)接口只含有一個(gè)方法糙捺,這顯然是不合適的诫咱。

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

共同點(diǎn):都是盡可能的縮小涉及的范圍。

不同點(diǎn):?jiǎn)我辉瓌t主要是指封裝性洪灯。他針對(duì)的是一個(gè)類(lèi)坎缭、一個(gè)方法,是從對(duì)象的角度考慮的婴渡。而接口隔離原則是指類(lèi)之間的耦合應(yīng)該保持的一個(gè)度。他針對(duì)的是類(lèi)(對(duì)象)和類(lèi)(對(duì)象)之間的關(guān)系凯亮。如果說(shuō)單一原則指的是思想單純边臼,那么接口隔離指的就是社會(huì)關(guān)系簡(jiǎn)單啦。

5)依賴(lài)置換原則

這個(gè)原則的名字比較唬人假消,我們先看看他的內(nèi)容究竟是什么柠并。在設(shè)計(jì)模式中對(duì)該原則有兩句經(jīng)典的描述:

(1)高層模塊不應(yīng)該依賴(lài)底層模塊。兩者都應(yīng)該依賴(lài)抽象富拗。

(2)抽象不應(yīng)該依賴(lài)細(xì)節(jié)臼予,細(xì)節(jié)應(yīng)該依賴(lài)抽象。

這兩句話(huà)的含義是:高層模塊不應(yīng)該依賴(lài)底層模塊啃沪。兩者應(yīng)該通過(guò)抽象的東西進(jìn)行關(guān)系鏈接(抽象的東西是指接口或者抽象類(lèi))粘拾。其次抽象類(lèi)或者一個(gè)接口不應(yīng)該依賴(lài)某個(gè)實(shí)現(xiàn)類(lèi)。而這些實(shí)現(xiàn)類(lèi)反而應(yīng)該依賴(lài)于這個(gè)抽象類(lèi)的設(shè)定创千。

通俗一點(diǎn)的說(shuō)法就是缰雇,模塊之間不應(yīng)該直接產(chǎn)生調(diào)用關(guān)系(這是舊有的調(diào)用關(guān)系),兩者應(yīng)該通過(guò)面向接口(或者理解為面向設(shè)定的契約)進(jìn)行編程追驴。而這些契約和接口更不應(yīng)該以來(lái)自底層模塊而設(shè)定械哟。這些底層模塊反而應(yīng)該遵守這些契約。因?yàn)槠跫s(抽象類(lèi)殿雪、接口)相對(duì)于哪些實(shí)現(xiàn)代碼暇咆,更不會(huì)改變,也就是更穩(wěn)定丙曙。所以依賴(lài)置換原則又叫作面向接口編程或面向契約編程爸业。本意就是調(diào)整原來(lái)的依賴(lài)關(guān)系,重行進(jìn)行了設(shè)定亏镰。

6)開(kāi)閉原則

開(kāi)閉原則是指:一個(gè)軟件沃呢、一套系統(tǒng)在開(kāi)發(fā)完成后,當(dāng)有增加或修改需求時(shí)拆挥,應(yīng)該對(duì)拓展代碼打開(kāi)薄霜,對(duì)修改原有代碼關(guān)閉某抓。

類(lèi)一旦確定,就不應(yīng)該再對(duì)其功能發(fā)生修改惰瓜。這是面向?qū)ο笤O(shè)計(jì)中否副,最重要最核心的原則。方案發(fā)布后崎坊,我們最擔(dān)心的是什么备禀?就是需求的變化,而需求一旦有變化奈揍,就要修改代碼曲尸。大部分的bug往往就是這時(shí)候引入的。因?yàn)樾薷拇a時(shí)男翰,我們往往將重點(diǎn)放在另患,如何解決當(dāng)前bug上,反而沒(méi)有注意因?yàn)檫@個(gè)修改蛾绎,對(duì)原有設(shè)計(jì)的影響昆箕。

這條原則沒(méi)有具體的指導(dǎo)要求,是前邊五條原則的根本租冠。

ps鹏倘,這六個(gè)面向?qū)ο蟮脑瓌t,并不是是和否的問(wèn)題顽爹,也不是遵守和不遵守的問(wèn)題纤泵。而是遵守的多和遵守的少的問(wèn)題。我在文中也多次強(qiáng)調(diào)镜粤,我們?cè)谠O(shè)計(jì)時(shí)夕吻,應(yīng)該注意把握一個(gè)度。誠(chéng)然盡可能的遵守這些原則繁仁,會(huì)使代碼維護(hù)起來(lái)更容易涉馅。但是維護(hù)粒度過(guò)細(xì),所需要的設(shè)計(jì)和開(kāi)發(fā)成本成倍增加黄虱,這顯然是舍本逐末的稚矿。如圖,面向?qū)ο箝_(kāi)發(fā)原則可以從以下這個(gè)坐標(biāo)圖展示捻浦,不論是哪個(gè)維度晤揣,他的值都不應(yīng)該過(guò)滿(mǎn),甚至溢出朱灿,當(dāng)然也不能很低昧识,保持一個(gè)適當(dāng)?shù)亩燃纯伞?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盗扒,隨后出現(xiàn)的幾起案子跪楞,更是在濱河造成了極大的恐慌缀去,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甸祭,死亡現(xiàn)場(chǎng)離奇詭異缕碎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)池户,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)咏雌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人校焦,你說(shuō)我怎么就攤上這事赊抖。” “怎么了寨典?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵氛雪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凝赛,道長(zhǎng)注暗,這世上最難降的妖魔是什么坛缕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任墓猎,我火速辦了婚禮,結(jié)果婚禮上赚楚,老公的妹妹穿的比我還像新娘毙沾。我一直安慰自己,他們只是感情好宠页,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布左胞。 她就那樣靜靜地躺著,像睡著了一般举户。 火紅的嫁衣襯著肌膚如雪烤宙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,879評(píng)論 1 290
  • 那天俭嘁,我揣著相機(jī)與錄音躺枕,去河邊找鬼。 笑死供填,一個(gè)胖子當(dāng)著我的面吹牛拐云,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播近她,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼叉瘩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了粘捎?” 一聲冷哼從身側(cè)響起薇缅,我...
    開(kāi)封第一講書(shū)人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤危彩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捅暴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恬砂,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蓬痒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泻骤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梧奢,死狀恐怖狱掂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亲轨,我是刑警寧澤趋惨,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站惦蚊,受9級(jí)特大地震影響器虾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹦锋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一兆沙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莉掂,春花似錦葛圃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厘唾,卻和暖如春褥符,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抚垃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工喷楣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讯柔。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓抡蛙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親魂迄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粗截,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用捣炬、多...
    MinoyJet閱讀 3,922評(píng)論 1 15
  • 設(shè)計(jì)模式六大原則 設(shè)計(jì)模式六大原則(1):?jiǎn)我宦氊?zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類(lèi)變更的原因熊昌。通俗的說(shuō)绽榛,即一個(gè)類(lèi)...
    viva158閱讀 765評(píng)論 0 1
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計(jì)模式六...
    Bloo_m閱讀 707評(píng)論 0 7
  • 單一職責(zé)原則 (SRP) 全稱(chēng) SRP , Single Responsibility Principle 單一職...
    米莉_L閱讀 1,761評(píng)論 2 5
  • 進(jìn)入了暑期,氣溫驟然升高婿屹,而且正在繼續(xù)灭美,早晨的陽(yáng)光有些刺眼,下午的陽(yáng)光有些灼痛昂利。男人們的衣服不能再脫了届腐,女人的衣服...
    魏周全閱讀 469評(píng)論 1 3