Java設(shè)計(jì)模式序篇

一、設(shè)計(jì)模式(Design Patterns)

設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用揣苏、多數(shù)人知曉的悯嗓、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)舒岸。使用設(shè)計(jì)模式是為了可重用代碼绅作、讓代碼更容易被他人理解、保證代碼可靠性蛾派。 毫無(wú)疑問(wèn)俄认,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的,設(shè)計(jì)模式使代碼編制真正工程化洪乍,設(shè)計(jì)模式是軟件工程的基石眯杏,如同大廈的一塊塊磚石一樣。項(xiàng)目中合理的運(yùn)用設(shè)計(jì)模式可以完美的解決很多問(wèn)題壳澳,每種模式在現(xiàn)在中都有相應(yīng)的原理來(lái)與之對(duì)應(yīng)岂贩,每一個(gè)模式描述了一個(gè)在我們周?chē)粩嘀貜?fù)發(fā)生的問(wèn)題,以及該問(wèn)題的核心解決方案巷波,這也是它能被廣泛應(yīng)用的原因萎津。

希望廣大程序愛(ài)好者卸伞,學(xué)好設(shè)計(jì)模式,做一個(gè)優(yōu)秀的軟件工程師锉屈!

二荤傲、面向?qū)ο蟮牧笤瓌t

單一職責(zé)原則

一個(gè)類(lèi)只做它該做的事情。(單一職責(zé)原則想表達(dá)的就是”高內(nèi)聚”颈渊,寫(xiě)代碼最終極的原則只有六個(gè)字”高內(nèi)聚遂黍、低耦合”,就如同葵花寶典或辟邪劍譜的中心思想就八個(gè)字”欲練此功必先自宮”俊嗽,所謂的高內(nèi)聚就是一個(gè)代碼模塊只完成一項(xiàng)功能雾家,在面向?qū)ο笾校绻蛔屢粋€(gè)類(lèi)完成它該做的事绍豁,而不涉及與它無(wú)關(guān)的領(lǐng)域就是踐行了高內(nèi)聚的原則芯咧,這個(gè)類(lèi)就只有單一職責(zé)。我們都知道一句話叫”因?yàn)閷?zhuān)注妹田,所以專(zhuān)業(yè)”唬党,一個(gè)對(duì)象如果承擔(dān)太多的職責(zé)鹃共,那么注定它什么都做不好鬼佣。這個(gè)世界上任何好的東西都有兩個(gè)特征,一個(gè)是功能單一霜浴,好的相機(jī)絕對(duì)不是電視購(gòu)物里面賣(mài)的那種一個(gè)機(jī)器有一百多種功能的晶衷,它基本上只能照相;另一個(gè)是模塊化阴孟,好的自行車(chē)是組裝車(chē)晌纫,從減震叉、剎車(chē)到變速器永丝,所有的部件都是可以拆卸和重新組裝的锹漱,好的乒乓球拍也不是成品拍,一定是底板和膠皮可以拆分和自行組裝的慕嚷,一個(gè)好的軟件系統(tǒng)哥牍,它里面的每個(gè)功能模塊也應(yīng)該是可以輕易的拿到其他系統(tǒng)中使用的,這樣才能實(shí)現(xiàn)軟件復(fù)用的目標(biāo)喝检。)

開(kāi)閉原則

軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放嗅辣,對(duì)修改關(guān)閉。(在理想的狀態(tài)下挠说,當(dāng)我們需要為一個(gè)軟件系統(tǒng)增加新功能時(shí)澡谭,只需要從原來(lái)的系統(tǒng)派生出一些新類(lèi)就可以,不需要修改原來(lái)的任何一行代碼损俭。要做到開(kāi)閉有兩個(gè)要點(diǎn):①抽象是關(guān)鍵蛙奖,一個(gè)系統(tǒng)中如果沒(méi)有抽象類(lèi)或接口系統(tǒng)就沒(méi)有擴(kuò)展點(diǎn)潘酗;②封裝可變性,將系統(tǒng)中的各種可變因素封裝到一個(gè)繼承結(jié)構(gòu)中雁仲,如果多個(gè)可變因素混雜在一起崎脉,系統(tǒng)將變得復(fù)雜而換亂,如果不清楚如何封裝可變性伯顶,可以參考《設(shè)計(jì)模式精解》一書(shū)中對(duì)橋梁模式的講解的章節(jié)灶体。)

依賴(lài)倒置原則

面向接口編程掐暮。(該原則說(shuō)得直白和具體一些就是聲明方法的參數(shù)類(lèi)型蝎抽、方法的返回類(lèi)型、變量的引用類(lèi)型時(shí)路克,盡可能使用抽象類(lèi)型而不用具體類(lèi)型樟结,因?yàn)槌橄箢?lèi)型可以被它的任何一個(gè)子類(lèi)型所替代,請(qǐng)參考下面的里氏替換原則精算。)
里氏替換原則:任何時(shí)候都可以用子類(lèi)型替換掉父類(lèi)型瓢宦。(關(guān)于里氏替換原則的描述,Barbara Liskov女士的描述比這個(gè)要復(fù)雜得多灰羽,但簡(jiǎn)單的說(shuō)就是能用父類(lèi)型的地方就一定能使用子類(lèi)型。里氏替換原則可以檢查繼承關(guān)系是否合理玫镐,如果一個(gè)繼承關(guān)系違背了里氏替換原則,那么這個(gè)繼承關(guān)系一定是錯(cuò)誤的怠噪,需要對(duì)代碼進(jìn)行重構(gòu)恐似。例如讓貓繼承狗,或者狗繼承貓傍念,又或者讓正方形繼承長(zhǎng)方形都是錯(cuò)誤的繼承關(guān)系口四,因?yàn)槟愫苋菀渍业竭`反里氏替換原則的場(chǎng)景。需要注意的是:子類(lèi)一定是增加父類(lèi)的能力而不是減少父類(lèi)的能力秦陋,因?yàn)樽宇?lèi)比父類(lèi)的能力更多蔓彩,把能力多的對(duì)象當(dāng)成能力少的對(duì)象來(lái)用當(dāng)然沒(méi)有任何問(wèn)題。)

接口隔離原則

接口要小而專(zhuān),絕不能大而全赤嚼。(臃腫的接口是對(duì)接口的污染旷赖,既然接口表示能力,那么一個(gè)接口只應(yīng)該描述一種能力更卒,接口也應(yīng)該是高度內(nèi)聚的等孵。例如,琴棋書(shū)畫(huà)就應(yīng)該分別設(shè)計(jì)為四個(gè)接口蹂空,而不應(yīng)設(shè)計(jì)成一個(gè)接口中的四個(gè)方法俯萌,因?yàn)槿绻O(shè)計(jì)成一個(gè)接口中的四個(gè)方法,那么這個(gè)接口很難用上枕,畢竟琴棋書(shū)畫(huà)四樣都精通的人還是少數(shù)咐熙,而如果設(shè)計(jì)成四個(gè)接口,會(huì)幾項(xiàng)就實(shí)現(xiàn)幾個(gè)接口辨萍,這樣的話每個(gè)接口被復(fù)用的可能性是很高的棋恼。Java中的接口代表能力、代表約定锈玉、代表角色爪飘,能否正確的使用接口一定是編程水平高低的重要標(biāo)識(shí)。)

迪米特原則

迪米特原則又叫最少知識(shí)原則拉背,一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解师崎。(迪米特法則簡(jiǎn)單的說(shuō)就是如何做到”低耦合”,門(mén)面模式和調(diào)停者模式就是對(duì)迪米特法則的踐行去团。對(duì)于門(mén)面模式可以舉一個(gè)簡(jiǎn)單的例子抡诞,你去一家公司洽談業(yè)務(wù),你不需要了解這個(gè)公司內(nèi)部是如何運(yùn)作的土陪,你甚至可以對(duì)這個(gè)公司一無(wú)所知,去的時(shí)候只需要找到公司入口處的前臺(tái)美女肴熏,告訴她們你要做什么鬼雀,她們會(huì)找到合適的人跟你接洽,前臺(tái)的美女就是公司這個(gè)系統(tǒng)的門(mén)面蛙吏。再?gòu)?fù)雜的系統(tǒng)都可以為用戶提供一個(gè)簡(jiǎn)單的門(mén)面源哩,Java Web開(kāi)發(fā)中作為前端控制器的Servlet或Filter不就是一個(gè)門(mén)面嗎,瀏覽器對(duì)服務(wù)器的運(yùn)作方式一無(wú)所知鸦做,但是通過(guò)前端控制器就能夠根據(jù)你的請(qǐng)求得到相應(yīng)的服務(wù)励烦。調(diào)停者模式也可以舉一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明,例如一臺(tái)計(jì)算機(jī)泼诱,CPU坛掠、內(nèi)存、硬盤(pán)、顯卡屉栓、聲卡各種設(shè)備需要相互配合才能很好的工作舷蒲,但是如果這些東西都直接連接到一起,計(jì)算機(jī)的布線將異常復(fù)雜友多,在這種情況下牲平,主板作為一個(gè)調(diào)停者的身份出現(xiàn),它將各個(gè)設(shè)備連接在一起而不需要每個(gè)設(shè)備之間直接交換數(shù)據(jù)域滥,這樣就減小了系統(tǒng)的耦合度和復(fù)雜度纵柿,如下圖所示。迪米特法則用通俗的話來(lái)將就是不要和陌生人打交道启绰,如果真的需要藐窄,找一個(gè)自己的朋友,讓他替你和陌生人打交道酬土。)

里氏替換原則

任何時(shí)候都可以用子類(lèi)型替換掉父類(lèi)型荆忍。(關(guān)于里氏替換原則的描述,Barbara Liskov女士的描述比這個(gè)要復(fù)雜得多撤缴,但簡(jiǎn)單的說(shuō)就是能用父類(lèi)型的地方就一定能使用子類(lèi)型刹枉。里氏替換原則可以檢查繼承關(guān)系是否合理,如果一個(gè)繼承關(guān)系違背了里氏替換原則屈呕,那么這個(gè)繼承關(guān)系一定是錯(cuò)誤的微宝,需要對(duì)代碼進(jìn)行重構(gòu)。例如讓貓繼承狗虎眨,或者狗繼承貓蟋软,又或者讓正方形繼承長(zhǎng)方形都是錯(cuò)誤的繼承關(guān)系,因?yàn)槟愫苋菀渍业竭`反里氏替換原則的場(chǎng)景嗽桩。需要注意的是:子類(lèi)一定是增加父類(lèi)的能力而不是減少父類(lèi)的能力岳守,因?yàn)樽宇?lèi)比父類(lèi)的能力更多,把能力多的對(duì)象當(dāng)成能力少的對(duì)象來(lái)用當(dāng)然沒(méi)有任何問(wèn)題碌冶。)

三湿痢、設(shè)計(jì)模式的分類(lèi)

總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類(lèi):

創(chuàng)建型模式,共五種:工廠方法模式扑庞、抽象工廠模式譬重、單例模式、建造者模式罐氨、原型模式臀规。

結(jié)構(gòu)型模式,共七種:適配器模式栅隐、裝飾器模式塔嬉、代理模式玩徊、外觀模式、橋接模式邑遏、組合模式佣赖、享元模式。

行為型模式记盒,共十一種:策略模式憎蛤、模板方法模式、觀察者模式纪吮、迭代子模式俩檬、責(zé)任鏈模式、命令模式碾盟、備忘錄模式棚辽、狀態(tài)模式、訪問(wèn)者模式冰肴、中介者模式屈藐、解釋器模式。

其實(shí)還有兩類(lèi):并發(fā)型模式和線程池模式熙尉。用一個(gè)圖片來(lái)整體描述一下:

接下來(lái)的章節(jié)將對(duì)這些設(shè)計(jì)模式逐一進(jìn)行概述联逻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市检痰,隨后出現(xiàn)的幾起案子包归,更是在濱河造成了極大的恐慌,老刑警劉巖铅歼,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件公壤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡椎椰,警方通過(guò)查閱死者的電腦和手機(jī)厦幅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俭识,“玉大人慨削,你說(shuō)我怎么就攤上這事√酌模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵磁椒,是天一觀的道長(zhǎng)堤瘤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浆熔,這世上最難降的妖魔是什么本辐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上慎皱,老公的妹妹穿的比我還像新娘老虫。我一直安慰自己,他們只是感情好茫多,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布祈匙。 她就那樣靜靜地躺著,像睡著了一般天揖。 火紅的嫁衣襯著肌膚如雪夺欲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天今膊,我揣著相機(jī)與錄音些阅,去河邊找鬼。 笑死斑唬,一個(gè)胖子當(dāng)著我的面吹牛市埋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恕刘,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缤谎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了雪营?” 一聲冷哼從身側(cè)響起弓千,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎献起,沒(méi)想到半個(gè)月后洋访,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谴餐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年姻政,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岂嗓。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汁展,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厌殉,到底是詐尸還是另有隱情食绿,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布公罕,位于F島的核電站器紧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏楼眷。R本人自食惡果不足惜铲汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一熊尉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掌腰,春花似錦狰住、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至士飒,卻和暖如春查邢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酵幕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工扰藕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芳撒。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓邓深,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親笔刹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芥备,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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