互聯(lián)網(wǎng)常用設(shè)計(jì)模式——通往架構(gòu)師的第一步

什么是設(shè)計(jì)模式粹庞?

Christopher Alexander 說(shuō)過(guò):“每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問(wèn)題玫芦,以及該問(wèn)題的解決方案的核心耻瑟。這樣弧腥,你就能一次又一次地使用該方案而不必做重復(fù)勞動(dòng)”厦取。簡(jiǎn)單來(lái)說(shuō)就是:

設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多數(shù)人知曉的管搪、經(jīng)過(guò)分類編目的虾攻、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),使用設(shè)計(jì)模式是為了可重用代碼更鲁、讓代碼更容易被他人理解并且保證代碼可靠性霎箍。

為什么有設(shè)計(jì)模式

設(shè)計(jì)模式開(kāi)發(fā)的規(guī)范,最優(yōu)的方案,選擇合適的模式可大大提高開(kāi)發(fā)效率,少走彎路。如果將設(shè)計(jì)模式比喻成“三十六計(jì)”澡为,那么每一個(gè)模式都是一種計(jì)策漂坏,它為解決某一類問(wèn)題而誕生,設(shè)計(jì)模式能很好的解決一些問(wèn)題媒至。

設(shè)計(jì)模式的分類

經(jīng)典應(yīng)用框架中常見(jiàn)的設(shè)計(jì)模式分為三類:

  • 創(chuàng)建型模式:對(duì)類的實(shí)例化過(guò)程的抽象樊拓。一些系統(tǒng)在創(chuàng)建對(duì)象時(shí),需要?jiǎng)討B(tài)地決定怎樣創(chuàng)建對(duì)象塘慕,創(chuàng)建哪些對(duì)象筋夏,以及如何組合和表示這些對(duì)象。創(chuàng)建模式描述了怎樣構(gòu)造和封裝這些動(dòng)態(tài)的決定图呢。包含類的創(chuàng)建模式和對(duì)象的創(chuàng)建模式条篷。

常見(jiàn)的創(chuàng)建型模式有:Factory 工廠模式Singleton 單例模式蛤织;Prototype 原型模式

  • 結(jié)構(gòu)型模式:描述如何將類或?qū)ο蠼Y(jié)合在一起形成更大的結(jié)構(gòu)赴叹。分為類的結(jié)構(gòu)模式和對(duì)象的結(jié)構(gòu)模式。類的結(jié)構(gòu)模式使用繼承把類指蚜,接口等組合在一起乞巧,以形成更大的結(jié)構(gòu)。類的結(jié)構(gòu)模式是靜態(tài)的摊鸡。對(duì)象的結(jié)構(gòu)模式描述怎樣把各種不同類型的對(duì)象組合在一起绽媒,以實(shí)現(xiàn)新的功能的方法蚕冬。對(duì)象的結(jié)構(gòu)模式是動(dòng)態(tài)的。

常見(jiàn)的結(jié)構(gòu)型模式有:Adapter 適配器模式是辕;Decorator 裝飾器模式囤热;Proxy 代理模式

  • 行為型模式:對(duì)在不同的對(duì)象之間劃分責(zé)任和算法的抽象化。不僅僅是關(guān)于類和對(duì)象的获三,并是關(guān)于他們之間的相互作用旁蔼。類的行為模式使用繼承關(guān)系在幾個(gè)類之間分配行為。對(duì)象的行為模式則使用對(duì)象的聚合來(lái)分配行為疙教。

常見(jiàn)的行為型模式有:Strategy 策略模式棺聊;Template 模板模式Delegate 委派模式贞谓;Observer 觀察者模式

設(shè)計(jì)模式使用頻率排行

注意:在常用的23種設(shè)計(jì)模式中其實(shí)面沒(méi)有委派模式(Delegate)的影子限佩,但是在Spring中委派模式確實(shí)用的比較多的一種模式,Spring MVC框架中的DispatcherServlet其實(shí)就用到了委派模式经宏。

單例模式(Singleton)

單例模式:Singleton的作用是保證在應(yīng)用程序中犀暑,一個(gè)類Class只有一個(gè)實(shí)例存在驯击。并提供全局訪問(wèn)烁兰。Singleton限制了實(shí)例個(gè)數(shù),有利于GC的回收徊都。

策略模式(Strategy)

策略模式:策略模式針對(duì)一組算法沪斟,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得它們可以相互替換暇矫。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化主之。策略模式把行為和環(huán)境分開(kāi)。環(huán)境類負(fù)責(zé)維持和查詢行為類李根,各種算法在具體的策略類中提供槽奕。由于算法和環(huán)境獨(dú)立開(kāi)來(lái),算法的增減房轿,修改都不會(huì)影響到環(huán)境和客戶端粤攒。

原型模式(Prototype)

原型模式:通過(guò)給出一個(gè)原型對(duì)象來(lái)指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用復(fù)制這個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象囱持。原始模型模式允許動(dòng)態(tài)的增加或減少產(chǎn)品類夯接,產(chǎn)品類不需要非得有任何事先確定的等級(jí)結(jié)構(gòu),原始模型模式適用于任何的等級(jí)結(jié)構(gòu)纷妆。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法

因?yàn)镴ava中的提供clone()方法來(lái)實(shí)現(xiàn)對(duì)象的克隆盔几,所以Prototype模式實(shí)現(xiàn)一下子變得很簡(jiǎn)單。

工廠模式(Factory)

工廠模式:定義一個(gè)用于創(chuàng)建對(duì)象的接口掩幢,讓接口子類通過(guò)工廠方法決定實(shí)例化哪一個(gè)類逊拍。

裝飾模式(Decorator)

裝飾模式:裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能上鞠,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性顺献。動(dòng)態(tài)給一個(gè)對(duì)象增加功能旗国,這些功能可以再動(dòng)態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能注整。

使用Decorator的理由是:這些功能需要由用戶動(dòng)態(tài)決定加入的方式和時(shí)機(jī)能曾。Decorator提供了"即插即用"的方法,在運(yùn)行期間決定何時(shí)增加何種功能肿轨。

適配器模式(Adapter)

適配器模式:把一個(gè)類的接口變換成客戶端所期待的另一種接口寿冕,從而使原本因接口原因不匹配而無(wú)法一起工作的兩個(gè)類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個(gè)合適的實(shí)例給客戶端
將兩個(gè)不兼容的類糾合在一起使用椒袍,屬于結(jié)構(gòu)型模式驼唱,需要Adaptee(被適配者)和Adaptor(適配器)兩個(gè)身份。

為何使用?
我們經(jīng)常碰到要將兩個(gè)沒(méi)有關(guān)系的類組合在一起使用驹暑,第一解決方案是:修改各自類的接口玫恳,但是如果我們沒(méi)有源代碼,或者优俘,我們不愿意為了一個(gè)應(yīng)用而修改各自的接口。 怎么辦? 使用Adapter帆焕,在這兩種接口之間創(chuàng)建一個(gè)混合接口(混血兒)惭婿。

如何使用?
實(shí)現(xiàn)Adapter方式,其實(shí)"think in Java"的"類再生"一節(jié)中已經(jīng)提到叶雹,有兩種方式:組合(composition)和繼承(inheritance)财饥。

代理模式(Proxy)

代理模式:代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)源對(duì)象的引用折晦。代理就是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動(dòng)钥星。

某些情況下,客戶不想或者不能夠直接引用一個(gè)對(duì)象满着,代理對(duì)象可以在客戶和目標(biāo)對(duì)象直接起到中介的作用谦炒。客戶端分辨不出代理主題對(duì)象與真實(shí)主題對(duì)象漓滔。代理模式可以并不知道真正的被代理對(duì)象编饺,而僅僅持有一個(gè)被代理對(duì)象的接口,這時(shí)候代理對(duì)象不能夠創(chuàng)建被代理對(duì)象响驴,被代理對(duì)象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入透且。

觀察者模式(Observer)

觀察者模式:觀察者模式定義了一種一隊(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí)秽誊,會(huì)通知所有觀察者對(duì)象鲸沮,使他們能夠自動(dòng)更新自己。發(fā)布訂閱锅论。

模板模式(Template)

模板模式:模板方法模式準(zhǔn)備一個(gè)抽象類讼溺,將部分邏輯以具體方法以及具體構(gòu)造子的形式實(shí)現(xiàn),然后聲明一些抽象方法來(lái)迫使子類實(shí)現(xiàn)剩余的邏輯最易。

不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法怒坯,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。先制定一個(gè)頂級(jí)邏輯框架藻懒,而將邏輯的細(xì)節(jié)留給具體的子類去實(shí)現(xiàn)剔猿。

關(guān)于設(shè)計(jì)模式的一點(diǎn)總結(jié)

設(shè)計(jì)上的事就是這樣,想到了嬉荆, 就能比較優(yōu)雅的解決問(wèn)題归敬,想不到的話, 就只能使用到處修改代碼的方法比較笨拙的應(yīng)對(duì)問(wèn)題鄙早,還容易將項(xiàng)目弄的混亂汪茧。

現(xiàn)在我比較慶幸當(dāng)初學(xué)習(xí)了設(shè)計(jì)模式,而沒(méi)有聽(tīng)其他人的“建議”:我們做的項(xiàng)目中用不到設(shè)計(jì)模式限番,學(xué)這個(gè)沒(méi)用舱污。設(shè)計(jì)模式是個(gè)好東西,以后肯定還要進(jìn)一步的學(xué)習(xí)扳缕,并且在項(xiàng)目中多實(shí)踐慌闭,提升自己的設(shè)計(jì)能力别威。

當(dāng)然也建議你們看看這套關(guān)于設(shè)計(jì)模式視頻躯舔,放在群895244712里面 或許會(huì)給你們一些啟發(fā)。其實(shí)設(shè)計(jì)模式并不難省古,難的是真正領(lǐng)悟它的精妙粥庄,并且能靈活的運(yùn)用于日常項(xiàng)目的開(kāi)發(fā)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豺妓,一起剝皮案震驚了整個(gè)濱河市惜互,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琳拭,老刑警劉巖训堆,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異白嘁,居然都是意外死亡坑鱼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鲁沥,“玉大人呼股,你說(shuō)我怎么就攤上這事』。” “怎么了彭谁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)允扇。 經(jīng)常有香客問(wèn)我缠局,道長(zhǎng),這世上最難降的妖魔是什么考润? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任甩鳄,我火速辦了婚禮,結(jié)果婚禮上额划,老公的妹妹穿的比我還像新娘妙啃。我一直安慰自己,他們只是感情好俊戳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布揖赴。 她就那樣靜靜地躺著,像睡著了一般抑胎。 火紅的嫁衣襯著肌膚如雪燥滑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天阿逃,我揣著相機(jī)與錄音铭拧,去河邊找鬼。 笑死恃锉,一個(gè)胖子當(dāng)著我的面吹牛搀菩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播破托,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肪跋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了土砂?” 一聲冷哼從身側(cè)響起州既,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萝映,沒(méi)想到半個(gè)月后吴叶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡序臂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蚌卤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡造寝,死狀恐怖磕洪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诫龙,我是刑警寧澤析显,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站签赃,受9級(jí)特大地震影響谷异,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锦聊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一歹嘹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孔庭,春花似錦尺上、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芽淡,卻和暖如春马绝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挣菲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工富稻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人白胀。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓椭赋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親纹笼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纹份,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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