摘要:設(shè)計模式的分類經(jīng)典應(yīng)用框架中常見的設(shè)計模式分為三類創(chuàng)建型模式對類的實例化過程的抽象。對象的結(jié)構(gòu)模式是動態(tài)的。對象的行為模式則使用對象的聚合來分配行為。設(shè)計模式是個好東西,以后肯定還要進(jìn)一步的學(xué)習(xí),并且在項目中多實踐,提升自己的設(shè)計能力。
什么是設(shè)計模式?
Christopher Alexander?說過:“每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復(fù)勞動”。簡單來說就是:
設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié),使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解并且保證代碼可靠性。為什么有設(shè)計模式
設(shè)計模式開發(fā)的規(guī)范,最優(yōu)的方案,選擇合適的模式可大大提高開發(fā)效率,少走彎路。如果將設(shè)計模式比喻成“三十六計”,那么每一個模式都是一種計策,它為解決某一類問題而誕生,設(shè)計模式能很好的解決一些問題。
設(shè)計模式的分類經(jīng)典應(yīng)用框架中常見的設(shè)計模式分為三類:
創(chuàng)建型模式:對類的實例化過程的抽象。一些系統(tǒng)在創(chuàng)建對象時,需要動態(tài)地決定怎樣創(chuàng)建對象,創(chuàng)建哪些對象,以及如何組合和表示這些對象。創(chuàng)建模式描述了怎樣構(gòu)造和封裝這些動態(tài)的決定。包含類的創(chuàng)建模式和對象的創(chuàng)建模式。
常見的創(chuàng)建型模式有:Factory 工廠模式;Singleton 單例模式;Prototype 原型模式
結(jié)構(gòu)型模式:描述如何將類或?qū)ο蠼Y(jié)合在一起形成更大的結(jié)構(gòu)。分為類的結(jié)構(gòu)模式和對象的結(jié)構(gòu)模式。類的結(jié)構(gòu)模式使用繼承把類,接口等組合在一起,以形成更大的結(jié)構(gòu)。類的結(jié)構(gòu)模式是靜態(tài)的。對象的結(jié)構(gòu)模式描述怎樣把各種不同類型的對象組合在一起,以實現(xiàn)新的功能的方法。對象的結(jié)構(gòu)模式是動態(tài)的。
常見的結(jié)構(gòu)型模式有:Adapter 適配器模式;Decorator 裝飾器模式;Proxy 代理模式
行為型模式:對在不同的對象之間劃分責(zé)任和算法的抽象化。不僅僅是關(guān)于類和對象的,并是關(guān)于他們之間的相互作用。類的行為模式使用繼承關(guān)系在幾個類之間分配行為。對象的行為模式則使用對象的聚合來分配行為。
常見的行為型模式有:Strategy 策略模式;Template 模板模式;Delegate 委派模式;Observer 觀察者模式
設(shè)計模式使用頻率排行注意:在常用的23種設(shè)計模式中其實面沒有委派模式(Delegate)的影子,但是在Spring中委派模式確實用的比較多的一種模式,Spring MVC框架中的DispatcherServlet其實就用到了委派模式。
單例模式(Singleton)單例模式:Singleton的作用是保證在應(yīng)用程序中,一個類Class只有一個實例存在。并提供全局訪問。Singleton限制了實例個數(shù),有利于GC的回收。
策略模式(Strategy)策略模式:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。策略模式把行為和環(huán)境分開。環(huán)境類負(fù)責(zé)維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環(huán)境獨立開來,算法的增減,修改都不會影響到環(huán)境和客戶端。
原型模式(Prototype)原型模式:通過給出一個原型對象來指明所要創(chuàng)建的對象的類型,然后用復(fù)制這個原型對象的方法創(chuàng)建出更多同類型的對象。原始模型模式允許動態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級結(jié)構(gòu),原始模型模式適用于任何的等級結(jié)構(gòu)。缺點是每一個類都必須配備一個克隆方法
因為Java中的提供clone()方法來實現(xiàn)對象的克隆,所以Prototype模式實現(xiàn)一下子變得很簡單。
工廠模式(Factory)工廠模式:定義一個用于創(chuàng)建對象的接口,讓接口子類通過工廠方法決定實例化哪一個類。
裝飾模式(Decorator)裝飾模式:裝飾模式以對客戶端透明的方式擴(kuò)展對象的功能,是繼承關(guān)系的一個替代方案,提供比繼承更多的靈活性。動態(tài)給一個對象增加功能,這些功能可以再動態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。
使用Decorator的理由是:這些功能需要由用戶動態(tài)決定加入的方式和時機(jī)。Decorator提供了"即插即用"的方法,在運(yùn)行期間決定何時增加何種功能。
適配器模式(Adapter)適配器模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個合適的實例給客戶端
將兩個不兼容的類糾合在一起使用,屬于結(jié)構(gòu)型模式,需要Adaptee(被適配者)和Adaptor(適配器)兩個身份。
為何使用?
我們經(jīng)常碰到要將兩個沒有關(guān)系的類組合在一起使用,第一解決方案是:修改各自類的接口,但是如果我們沒有源代碼,或者,我們不愿意為了一個應(yīng)用而修改各自的接口。 怎么辦? 使用Adapter,在這兩種接口之間創(chuàng)建一個混合接口(混血兒)。
如何使用?
實現(xiàn)Adapter方式,其實"think in Java"的"類再生"一節(jié)中已經(jīng)提到,有兩種方式:組合(composition)和繼承(inheritance)。
代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機(jī)構(gòu)代表另一個人或者一個機(jī)構(gòu)采取行動。
某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標(biāo)對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。
觀察者模式(Observer)觀察者模式:觀察者模式定義了一種一隊多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。發(fā)布訂閱。
模板模式(Template)模板模式:模板方法模式準(zhǔn)備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。
不同的子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn)。先制定一個頂級邏輯框架,而將邏輯的細(xì)節(jié)留給具體的子類去實現(xiàn)。
關(guān)于設(shè)計模式的一點總結(jié)設(shè)計上的事就是這樣,想到了, 就能比較優(yōu)雅的解決問題,想不到的話, 就只能使用到處修改代碼的方法比較笨拙的應(yīng)對問題,還容易將項目弄的混亂。當(dāng)然也建議你們看看這套關(guān)于設(shè)計模式視頻,放在君羊895244712里面,或許會給你們一些啟發(fā)。
現(xiàn)在我比較慶幸當(dāng)初學(xué)習(xí)了設(shè)計模式,而沒有聽其他人的“建議”:我們做的項目中用不到設(shè)計模式,學(xué)這個沒用。設(shè)計模式是個好東西,以后肯定還要進(jìn)一步的學(xué)習(xí),并且在項目中多實踐,提升自己的設(shè)計能力。
其實設(shè)計模式并不難,難的是真正領(lǐng)悟它的精妙,并且能靈活的運(yùn)用于日常項目的開發(fā)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72385.html
摘要:正文本文是看到阿里巴巴系統(tǒng)架構(gòu)師黃勇的采訪記錄有感而發(fā),如有侵權(quán),請聯(lián)系我。下面就一起來看看阿里架構(gòu)師的十年架構(gòu)路。抱著這樣的信心,我加入了易傳媒,擔(dān)任系統(tǒng)架構(gòu)師職位。 showImg(https://segmentfault.com/img/remote/1460000016748965); 前言 做技術(shù)的,一定不能放棄技術(shù)。在精進(jìn)技術(shù)的同時完善其他方面的能力,十年如一日。不忘初心,...
摘要:本篇文章來自于騰訊和共同舉辦的技術(shù)開放日后臺專場出品人傅鴻城的分享,由壹佰案例整理編輯。對于騰訊而言,后臺服務(wù)可用性都是四個九,四個九轉(zhuǎn)化為時間就要求一年內(nèi)的故障時間不能超過分鐘。 showImg(https://segmentfault.com/img/bVvL5f); 本篇文章來自于騰訊SNG和msup共同舉辦的技術(shù)開放日后臺專場出品人傅鴻城的分享,由壹佰案例整理編輯。原文發(fā)布在壹...
摘要:從根本上講,架構(gòu)師是一個技術(shù)領(lǐng)導(dǎo)者的角色,這就是最大的區(qū)別。對于這個問題來說,沒錯,有一些相關(guān)主題沒有出現(xiàn)在這本書中,這些主題可以構(gòu)成一本與程序員必讀之軟件架構(gòu)相互補(bǔ)的書。我從軟件架構(gòu)的視角特別能注意到這件事。 非商業(yè)轉(zhuǎn)載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/178034 Simon Brown 是全球知...
摘要:畢竟,架構(gòu)師不參與寫代碼的工作。例如,通常架構(gòu)師需要針對可能發(fā)生的每種情況進(jìn)行規(guī)劃。這種架構(gòu)師需要信任開發(fā)團(tuán)隊來編寫代碼。 showImg(https://segmentfault.com/img/bVblaqV?w=900&h=383); Talk is cheap, show me the code!但是在互聯(lián)網(wǎng)企業(yè)中,身處技術(shù)要職的架構(gòu)師到底需不需要寫代碼? showImg(ht...
閱讀 2895·2021-11-17 09:33
閱讀 3674·2021-11-16 11:42
閱讀 3496·2021-10-26 09:50
閱讀 1346·2021-09-22 15:49
閱讀 3049·2021-08-10 09:44
閱讀 3680·2019-08-29 18:36
閱讀 3940·2019-08-29 16:43
閱讀 2229·2019-08-29 14:10