設(shè)計模式概論

設(shè)計模式(Design pattern)是很多程序員總結(jié)出來的優(yōu)秀實踐福侈。保證了代碼的可重用性肪凛、易讀性以及代碼的可靠性。設(shè)計模式使代碼編制真正實現(xiàn)工程化翘鸭,它是是軟件工程的基石脈絡(luò)就乓,如同大廈的結(jié)構(gòu)一樣生蚁。

提到設(shè)計模式邦投,不得不感謝GoF(Gang of Four尼摹,四人組),他們1995年出版的《設(shè)計模式》一書阅懦,第一次將設(shè)計模式提升到理論高度耳胎,并將之規(guī)范化怕午。書中一共總結(jié)了23種基本的設(shè)計模式郁惜。而這23中設(shè)計模式幾乎涵蓋了面向?qū)ο笤O(shè)計過程中所有問題的解決方案兆蕉。書中提到的23種設(shè)計模式分別是:

1.單例模式 2.工廠方法模式 3.抽象工廠模式 4.模版方法模式 5.建造者模式 6.代理模式 7.原型模式 8.中介者模式 9.命令模式 10.責(zé)任鏈模式 11.裝飾模式 12.策略模式 13.適配器模式 14.迭代器模式 15.組合模式 16.觀察者模式 17.門面模式 18.備忘錄模式 19.訪問者模式 20.狀態(tài)模式 21.解釋器模式 22.享元模式 23.橋梁模式

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

1易稠、開閉原則OCP

對擴(kuò)展開放驶社、對修改關(guān)閉衬吆。通俗一點的講逊抡,在程序需要進(jìn)行功能擴(kuò)展的時候冒嫡,不可去修改原有的代碼孝凌。這樣做的意義在于蟀架,延伸了程序的擴(kuò)展性的同時片拍,使得項目版本升級更方便,代碼更易維護(hù)纲缓。

2祝高、里氏代換原則LSP

? 所有引用基類(父類)的地方必須能透明地使用其子類的對象工闺,舉一個通俗易懂的例子來幫助理解:我喜歡動物斤寂,那我一定喜歡狗罗侯,因為狗是動物的子類钩杰;但是我喜歡狗讲弄,不能據(jù)此斷定我喜歡動物,因為我并不喜歡老鼠瓶摆,雖然它也是動物。

相信上面這個例子不難理解吧书斜,那我們再來一個程序中的例子:例如有兩個類荐吉,一個類為BaseClass父類,另一個是SubClass子類瞧哟,那么一個方法如果可以接受一個BaseClass類型的基類對象base的話勤揩,如:method1(base),那么它必然可以接受一個BaseClass類型的子類對象sub负蠕,如:method1(sub),都是可以正常運行的叠赐。反過來的代換不成立赛不,如果一個方法method2可以接受子類對象sub為參數(shù):method2(sub),那么一般而言不可以接受父類對象base,除非是重載方法斜脂。一句話來概括一下吧,能夠接受父類引用的方法,必然可以接受子類;而可以接受子類引用的方法产场,卻不能接受父類引用窿冯。

里氏替換原則通俗的來講就是:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能,假如我們不遵循里氏替換原則缠沈,那么寫的代碼出問題的概率會大大增加漱竖。

3躺率、控制反轉(zhuǎn)原則IOC

控制反轉(zhuǎn)良狈。在Java開發(fā)中薪丁,IoC意味著將你設(shè)計好的類交給系統(tǒng)去控制遇西,而不是在你的類內(nèi)部控制。這稱為控制反轉(zhuǎn)严嗜。

在傳統(tǒng)的實現(xiàn)中粱檀,由程序內(nèi)部代碼來控制程序之間的關(guān)系。我們經(jīng)常使用new關(guān)鍵字來實現(xiàn)兩組鍵間關(guān)系的組合漫玄,這種實現(xiàn)的方式會造成組件之間耦合(一個好的設(shè)計茄蚯,不但要實現(xiàn)代碼重用,還要將組件間關(guān)系解耦)。IoC很好的解決了該問題渗常,它將實現(xiàn)組件間關(guān)系從程序內(nèi)部提到外部容器來管理壮不。也就是說由容器在運行期將組件間的某種依賴關(guān)系動態(tài)的注入組件中〉是控制程序間關(guān)系的實現(xiàn)交給了外部的容器來完成忆畅。這里有著名的好萊塢理論:你呆著別動衡未,到時我會找你尸执。但是我們使用時候要注意一個問題,靜態(tài)類的使用會導(dǎo)致IoC設(shè)計原則受到限制缓醋,因為在Java世界如失,類的名稱是硬編碼的,所以靜態(tài)類的使用會導(dǎo)致類之間通過名稱綁定在一起送粱,這使得單獨測試某個組件變得更加困難褪贵。

4、接口隔離原則ISP

建立單一接口抗俄,不要建立龐大臃腫的接口脆丁,盡量細(xì)化接口,接口中的方法盡量少动雹。也就是說槽卫,我們要為各個類建立專用的接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調(diào)用胰蝠。

5歼培、迪米特法則DP

如果兩個軟件實體無需直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用茸塞,可以通過第三方轉(zhuǎn)發(fā)該調(diào)用躲庄。

優(yōu)點

降低類與類之間的耦合度

提高了類的可復(fù)用率和系統(tǒng)的擴(kuò)展性

缺點

過度使用會使系統(tǒng)產(chǎn)生大量的中介類,從而增加系統(tǒng)的復(fù)雜性钾虐,使模塊之間的通信效率降低噪窘。

6、合成復(fù)用原則

在實現(xiàn)復(fù)用時應(yīng)該多用關(guān)聯(lián)效扫,少用繼承倔监。

通過繼承來進(jìn)行復(fù)用的主要問題在于繼承復(fù)用會破壞系統(tǒng)的封裝性,因為繼承會將基類的實現(xiàn)細(xì)節(jié)暴露給子類荡短,由于基類的內(nèi)部細(xì)節(jié)通常對子類來說是可見的丐枉,所以這種復(fù)用又稱“白箱”復(fù)用,如果基類發(fā)生改變掘托,那么子類的實現(xiàn)也不得不發(fā)生改變瘦锹;從基類繼承而來的實現(xiàn)是靜態(tài)的,不可能在運行時發(fā)生改變,沒有足夠的靈活性弯院;

由于組合或聚合關(guān)系可以將已有的對象(也可稱為成員對象)納入到新對象中辱士,使之成為新對象的一部分,因此新對象可以調(diào)用已有對象的功能听绳,這樣做可以使得成員對象的內(nèi)部實現(xiàn)細(xì)節(jié)對于新對象不可見颂碘,所以這種復(fù)用又稱為“黑箱”復(fù)用,相對繼承關(guān)系而言椅挣,其耦合度相對較低头岔,成員對象的變化對新對象的影響不大,可以在新對象中根據(jù)實際需要有選擇性地調(diào)用成員對象的操作鼠证;合成復(fù)用可以在運行時動態(tài)進(jìn)行峡竣,新對象可以動態(tài)地引用與成員對象類型相同的其他對象。

在軟件設(shè)計的過程中量九,只要我們盡量遵循以上六條設(shè)計原則适掰,設(shè)計出來的軟件一定會是一個優(yōu)秀的軟件,它必定足夠健壯荠列、足夠穩(wěn)定类浪,并以極大的靈活性來迎接隨時而來的需求變更等因素

這里我只是簡要概括了6大原則的核心思想,附上我認(rèn)為講的很透徹的大神博客地址:https://blog.csdn.net/zhengzhb/category_9260995.html

其中最最經(jīng)典的一句就是用抽象構(gòu)建框架肌似,用實現(xiàn)擴(kuò)展細(xì)節(jié)费就。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锈嫩,隨后出現(xiàn)的幾起案子受楼,更是在濱河造成了極大的恐慌,老刑警劉巖呼寸,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艳汽,死亡現(xiàn)場離奇詭異,居然都是意外死亡对雪,警方通過查閱死者的電腦和手機(jī)河狐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑟捣,“玉大人馋艺,你說我怎么就攤上這事÷跆祝” “怎么了捐祠?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桑李。 經(jīng)常有香客問我踱蛀,道長窿给,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任率拒,我火速辦了婚禮崩泡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猬膨。我一直安慰自己角撞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布勃痴。 她就那樣靜靜地躺著谒所,像睡著了一般。 火紅的嫁衣襯著肌膚如雪召耘。 梳的紋絲不亂的頭發(fā)上百炬,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音污它,去河邊找鬼。 笑死庶弃,一個胖子當(dāng)著我的面吹牛衫贬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歇攻,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼固惯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缴守?” 一聲冷哼從身側(cè)響起葬毫,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屡穗,沒想到半個月后贴捡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡村砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年烂斋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片础废。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡汛骂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出评腺,到底是詐尸還是另有隱情帘瞭,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布蒿讥,位于F島的核電站蝶念,受9級特大地震影響锋拖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祸轮,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一兽埃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧适袜,春花似錦柄错、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疫萤,卻和暖如春颂跨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扯饶。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工恒削, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尾序。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓钓丰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親每币。 傳聞我的和親對象是個殘疾皇子携丁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 1、概論 簡介 設(shè)計模式(Design Pattern)是設(shè)計過程中可以反復(fù)使用兰怠、可以解決特定問題的設(shè)計方法梦鉴。 目...
    fomin閱讀 103評論 0 0
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,222評論 0 2
  • 設(shè)計模式(Design Pattern)是前輩們在代碼實踐中所總結(jié)的經(jīng)驗揭保,是解決某些特定問題的套路肥橙。在使用一些優(yōu)秀...
    TurboSnail閱讀 694評論 0 0
  • javascript設(shè)計模式與開發(fā)實踐 設(shè)計模式 每個設(shè)計模式我們需要從三點問題入手: 定義 作用 用法與實現(xiàn) 單...
    穿牛仔褲的蚊子閱讀 4,058評論 0 13
  • 一、設(shè)計模式的分類 總體來說設(shè)計模式分為三大類: 創(chuàng)建型模式掖举,共五種:工廠方法模式快骗、抽象工廠模式、單例模式塔次、建造者...
    RamboLI閱讀 749評論 0 1