讀《大話(huà)設(shè)計(jì)模式》(1)用自己的話(huà)概括設(shè)計(jì)模式

1)特點(diǎn) 2)使用場(chǎng)景及補(bǔ)充

工廠模式(Factory):

1)將對(duì)象的創(chuàng)建實(shí)現(xiàn)隔離

2)適用于有繼承結(jié)構(gòu)的對(duì)象創(chuàng)建,根據(jù)參數(shù)決定實(shí)例化的內(nèi)容


策略模式(Strategy)(Context):

1)封裝算法,可相互替換

2)適用于多種算法可互相替換使用??山Y(jié)合工廠模式,根據(jù)傳入?yún)?shù)在構(gòu)造函數(shù)中生成具體算法對(duì)象。最終返回計(jì)算結(jié)果。


裝飾模式(Decorator):

1)動(dòng)態(tài)的給對(duì)象添加額外的職責(zé)

2)適用于要對(duì)一個(gè)對(duì)象的某些操作前后進(jìn)行一些附加職責(zé)的時(shí)候,而且這些職責(zé)是變化(有/無(wú) 先/后)的。而且根據(jù)開(kāi)閉原則,在擴(kuò)展功能的時(shí)候優(yōu)先思考裝飾模式


代理模式(Proxy)

1)控制一個(gè)對(duì)象的訪問(wèn)

2)應(yīng)用于要為對(duì)象添加權(quán)限限制或者加鎖,添加訪問(wèn)計(jì)數(shù)等附加職責(zé)。訪問(wèn)對(duì)象一定要先經(jīng)過(guò)代理。


工廠方法模式(Factory method):

1)定義接口使實(shí)例化的工作延遲到子類(lèi)

2)工廠模式是在工廠內(nèi)部用switch等方式判斷創(chuàng)建什么對(duì)象。工廠方法把這個(gè)問(wèn)題提前了,用戶(hù)傳進(jìn)來(lái)的不是switch的參數(shù)而是具體要使用的哪種工廠。問(wèn)題前移~


原型模式(Prototype):

1)通過(guò)拷貝創(chuàng)建新對(duì)象

2)原型模式和工廠模式相同,是創(chuàng)建對(duì)象的方式,通過(guò)拷貝創(chuàng)建對(duì)象,創(chuàng)建者不用知道創(chuàng)建的細(xì)節(jié),最重要的是可以得到對(duì)象運(yùn)行時(shí)的狀態(tài)?!具@里設(shè)計(jì)了深淺拷貝,java clone()方法原理是值復(fù)制,引用指向同一內(nèi)容,所以淺拷貝并不能復(fù)制對(duì)象。實(shí)現(xiàn)深拷貝一種是在set方法里創(chuàng)建新的對(duì)象,一種是在clone方法里面再次調(diào)用類(lèi)成員的clone】


模版模式(Template):

1)提煉骨架,子類(lèi)實(shí)現(xiàn)細(xì)節(jié)

2)適用于流程相同但具體實(shí)現(xiàn)不同的case,如果說(shuō)策略模式給的是一種算法的可替換,那么模版模式更像是一組解決方案,并且將整個(gè)流程提出的感覺(jué)。


外觀模式(Facade):

1)提煉接口,封裝部分,將代碼分塊

2)適用于:a.分割表示層,邏輯層和數(shù)據(jù)層 b.對(duì)于復(fù)雜的老舊的邏輯塊封裝一層facade可以減少依賴(lài),提煉接口也可以更好的分工。


建造者模式(Builder):

1)相較于工廠模式,監(jiān)督創(chuàng)建細(xì)節(jié)

2)建造者模式也是創(chuàng)建對(duì)象的模式,被創(chuàng)建的對(duì)象有相同的創(chuàng)造流程和不同的實(shí)現(xiàn);監(jiān)督者接受創(chuàng)建的具體對(duì)象并且執(zhí)行整個(gè)流程并返回執(zhí)行之后的創(chuàng)建的具體對(duì)象。即調(diào)用放知道要?jiǎng)?chuàng)建什么樣的產(chǎn)品但是無(wú)需知道創(chuàng)建過(guò)程,且保證所有創(chuàng)建步驟都進(jìn)行。


觀察者模式(Observer):

1)解決一對(duì)多的依賴(lài)關(guān)系的變化引發(fā)修改問(wèn)題。

2)觀察者維護(hù)觀察對(duì)象數(shù)組,當(dāng)觀察者發(fā)生變化的時(shí)候循環(huán)執(zhí)行所有與之依賴(lài)的對(duì)象的更改方法,完成更新。


抽象工廠模式(Abstract Factory):

1)解決不同“系列”對(duì)象的創(chuàng)建

2)不同于工廠模式可以根據(jù)參數(shù)決定創(chuàng)建的對(duì)象。也不像工廠方法模式,根據(jù)創(chuàng)建的具體工廠,決定返回的對(duì)象。抽象工廠主要解決的是“系列”的切換,每個(gè)工廠可以創(chuàng)建一個(gè)系列產(chǎn)品的各個(gè)組件。有利于“系列間的切換,并且將創(chuàng)建過(guò)程與客戶(hù)端分離。


狀態(tài)模式(Status):

1)將狀態(tài)變化的邏輯抽離,是狀態(tài)的轉(zhuǎn)化成為每個(gè)具體狀態(tài)類(lèi)自己的方法,易擴(kuò)展

2)適用于有大量ifelse或者swich判斷狀態(tài)變化代碼段的優(yōu)化,使類(lèi)的職責(zé)單一,使擴(kuò)展?fàn)顟B(tài)更加容易。


適配器模式(Adapter):

1)解決接口不兼容問(wèn)題

2)適用于使用原有的接口,又不想改變?cè)薪涌诨驅(qū)崿F(xiàn)的結(jié)構(gòu)(在設(shè)計(jì)初期不應(yīng)考慮)


備忘錄模式(Memento):

1)用于恢復(fù)原來(lái)保存的狀態(tài)

2)適用于保存進(jìn)度或者report的程序設(shè)計(jì)。值得一提的是要保存的類(lèi)的備忘錄類(lèi)與其并不存在關(guān)聯(lián)關(guān)系,而是通過(guò)另一個(gè)管理者類(lèi)控制,減輕了他們之間的耦合度。


組合模式(Component):

1)實(shí)現(xiàn)樹(shù)結(jié)構(gòu),統(tǒng)一管理

2)組合模式適用于管理整體與部分,通過(guò)都繼承同一個(gè)抽象類(lèi),統(tǒng)一相同的方法,通過(guò)調(diào)用“根”結(jié)構(gòu)的方法,使所有部分完成操作?!揪褪菢?shù)結(jié)構(gòu)的實(shí)現(xiàn)】


迭代器模式(Iterator):

1)實(shí)現(xiàn)對(duì)不同類(lèi)型數(shù)據(jù)的不同方式的遍歷

2)java中的各種集合列表等數(shù)據(jù)結(jié)構(gòu)都實(shí)現(xiàn)了iterator,也就是可以使用while(xxx.iterator().hasNext())進(jìn)行遍歷,當(dāng)然foreach也是適用于iterator的實(shí)現(xiàn)類(lèi)。當(dāng)然我們也可以通過(guò)實(shí)現(xiàn)iterator方法來(lái)改變遍歷方式。


單例模式(Singleton):

1)保證一個(gè)類(lèi)只被實(shí)例化一次

2)常見(jiàn)的幾種實(shí)現(xiàn)方法:雙重校驗(yàn)鎖;synchronize保證線程安全,static XX instance=new XX()裝載時(shí)實(shí)例化,用enum實(shí)現(xiàn)單例。


橋接模式(Bridge):

1)將抽象分離,使其獨(dú)立變化

2)適用于龐大的繼承結(jié)構(gòu),或者可以根據(jù)多種方式建立繼承關(guān)系的設(shè)計(jì)。涉及到聚合優(yōu)于繼承原則,繼承結(jié)構(gòu)是緊耦合的,父類(lèi)變化子類(lèi)受到影響,而聚合卻不是。將某一特性或者說(shuō)是一層繼承的共性提煉出來(lái)聚合到父類(lèi)完成解耦。另一種判斷是用isa和hasa判斷是否有可以解耦的部分。


命令模式(Commond):

1)將請(qǐng)求者和執(zhí)行者隔離,通過(guò)管理者管理命令的執(zhí)行。

2)其實(shí)命令模式的使用場(chǎng)景很局限,因?yàn)槲覀円恢狈钚蓄?lèi)是一個(gè)名詞而不是一個(gè)操作。但是命令模式也有其好處就是可以對(duì)操作進(jìn)行管理。通過(guò)管理者維護(hù)命令隊(duì)列實(shí)現(xiàn)決定何時(shí)執(zhí)行命令,記錄執(zhí)行的命令,撤銷(xiāo)已執(zhí)行命令等操作。


責(zé)任鏈模式(Chain of Responsibility):

1)請(qǐng)求方與執(zhí)行方解耦

2)適用于代碼中有層級(jí)關(guān)系的ifelse結(jié)構(gòu)。父類(lèi)包含自己的引用,子類(lèi)將引用指向下一個(gè)責(zé)任人(另一個(gè)子類(lèi)),由于都實(shí)現(xiàn)了同樣的方法,所以若子類(lèi)1不能處理則調(diào)用下一個(gè)責(zé)任人的處理方法。對(duì)于調(diào)用方只需知道第一責(zé)任人是誰(shuí)就可以了。


中介者模式(Mediator):

1)減少類(lèi)與類(lèi)之間的依賴(lài),把類(lèi)之間的交互由中介者完成

2)適用于一組對(duì)象以定義良好的但是復(fù)雜的方式進(jìn)行通訊,比如Form和控件,F(xiàn)orm就是中介者,每個(gè)控件可能會(huì)其他控件但不通過(guò)直接依賴(lài)實(shí)現(xiàn)。但是一般不考慮這種設(shè)計(jì)模式,因?yàn)橹薪檎弑旧硎且粋€(gè)低內(nèi)聚高耦合的結(jié)構(gòu),雖然類(lèi)的修改方便了,但是中介者的改動(dòng)不容易控制。


享元模式(FlyWeight):

1)通過(guò)共享實(shí)例減少細(xì)粒度實(shí)例的個(gè)數(shù)

2)適用于要new大量細(xì)粒度的類(lèi)(除了幾個(gè)參數(shù)其他都是相同的),比如棋子。將不可共享的參數(shù)外部化,在使用的時(shí)候作為參數(shù)傳入。減少存儲(chǔ)開(kāi)銷(xiāo)。


解釋器模式(Interpreter):

1)定義一種新的文法解讀

2)適用于自己要定義一種通用且常用的規(guī)則解決一些常見(jiàn)的問(wèn)題,比如正則表達(dá)式,樂(lè)譜翻譯器等。


訪問(wèn)者模式(Visitor):

1)將操作方法從類(lèi)中抽離,使操作擴(kuò)展性強(qiáng)。

2)訪問(wèn)者模式是有條件苛刻,所以應(yīng)用場(chǎng)景較少。適用于某類(lèi)的子類(lèi)不會(huì)發(fā)生改變且數(shù)量不多的情況,且操作存在差異。比如男人和女人。這樣每種操作只需要實(shí)現(xiàn)子類(lèi)數(shù)量個(gè)實(shí)現(xiàn)就可以了。擴(kuò)展操作的時(shí)候只需添加一個(gè)visitor的子類(lèi),實(shí)現(xiàn)對(duì)應(yīng)元素類(lèi)的子類(lèi)的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,098評(píng)論 1 15
  • 設(shè)計(jì)模式基本原則 開(kāi)放-封閉原則(OCP),是說(shuō)軟件實(shí)體(類(lèi)、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開(kāi)-閉原...
    西山薄涼閱讀 4,086評(píng)論 3 14
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,896評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • 春去秋來(lái),最美莫過(guò)人間四月天,四月的龍山,正是木棉花紅時(shí)。在遠(yuǎn)離她的這里,我悠悠遙望,喃喃自念:龍山的木棉花又開(kāi)了...
    c老靈魂閱讀 751評(píng)論 0 2

友情鏈接更多精彩內(nèi)容