相關(guān)模式辨析

0.提前說(shuō)明

  • 模式選擇的方法
    1)模式的功能——看是否能解決問(wèn)題
    2)模式的本質(zhì)——看模式是否主要用來(lái)解決這類問(wèn)題
    3)模式的適用程度——看使用這個(gè)模式是否貼切,看是否需要變形
    4)應(yīng)用模式的復(fù)雜程度——看使用模式帶來(lái)的開(kāi)發(fā)復(fù)雜度是否可接受或可控
    5)應(yīng)用模式的代價(jià)——看使用模式的代價(jià)是否可接受或可控,如:引入過(guò)多的對(duì)象宁玫、耗費(fèi)更多的內(nèi)存等

  • 很多模式都可以組合使用,并不局限于這里要講的

  • 有些模式功能相近笤成,結(jié)構(gòu)類似需频,要特別注意他們的辨析

  • 掌握模式一定要從思想上、本質(zhì)上埠况、整體上去把握

1. 簡(jiǎn)單工廠的相關(guān)模式

1.1 簡(jiǎn)單工廠和抽象工廠模式

簡(jiǎn)單工廠是用來(lái)選擇實(shí)現(xiàn)的耸携,可以選擇任意接口的實(shí)現(xiàn),一個(gè)簡(jiǎn)單工廠可以有多個(gè)用于選擇并創(chuàng)建對(duì)象的方法辕翰,多個(gè)方法創(chuàng)建的對(duì)象可以有關(guān)系也可以沒(méi)有關(guān)系夺衍。

抽象工廠模式是用來(lái)選擇產(chǎn)品簇的實(shí)現(xiàn)的,也就是說(shuō)一般抽象工廠里面有多個(gè)用于選擇并創(chuàng)建對(duì)象的方法喜命,但是這些方法所創(chuàng)建的對(duì)象之間通常是有關(guān)系的沟沙,這些被創(chuàng)建的對(duì)象通常是構(gòu)成一個(gè)產(chǎn)品簇所需要的部件對(duì)象。

所以從某種意義上來(lái)說(shuō)壁榕,簡(jiǎn)單工廠和抽象工廠是類似的矛紫,如果抽象工廠退化成為只有一個(gè)實(shí)現(xiàn),不分層次牌里,那么就相當(dāng)于簡(jiǎn)單工廠了借卧。

1.2 簡(jiǎn)單工廠和工廠方法模式

簡(jiǎn)單工廠和工廠方法模式也是非常類似的隆判。

工廠方法的本質(zhì)也是用來(lái)選擇實(shí)現(xiàn)的月劈,跟簡(jiǎn)單工廠的區(qū)別在于工廠方法是把選擇具體實(shí)現(xiàn)的功能延遲到子類去實(shí)現(xiàn)越除。

如果把工廠方法中選擇的實(shí)現(xiàn)放到父類直接實(shí)現(xiàn),那就等同于簡(jiǎn)單工廠

1.3 簡(jiǎn)單工廠和能創(chuàng)建對(duì)象實(shí)例的模式

簡(jiǎn)單工廠的本質(zhì)是選擇實(shí)現(xiàn)态辛,所以它可以跟其它任何能夠具體的創(chuàng)建對(duì)象實(shí)例的模式配合使用麸澜,比如:?jiǎn)卫J健⒃湍J揭蛎睢⑸善髂J降鹊取?/p>

2.外觀模式的相關(guān)模式

2.1 外觀模式和中介者模式

這兩個(gè)模式非常類似痰憎,但是有本質(zhì)的區(qū)別票髓。

中介者模式主要用來(lái)封裝多個(gè)對(duì)象之間相互的交互,多用在系統(tǒng)內(nèi)部的多
個(gè)模塊之間铣耘;而外觀模式封裝的是單向的交互洽沟,是從客戶端訪問(wèn)系統(tǒng)的調(diào)用,沒(méi)有從系統(tǒng)中來(lái)訪問(wèn)客戶端的調(diào)用蜗细。

在中介者模式的實(shí)現(xiàn)里面裆操,是需要實(shí)現(xiàn)具體的交互功能的;而外觀模式的實(shí)現(xiàn)里面炉媒,一般是組合調(diào)用或是轉(zhuǎn)調(diào)內(nèi)部實(shí)現(xiàn)的功能踪区,通常外觀模式本身并不實(shí)現(xiàn)這些功能。

中介者模式的目的主要是松散多個(gè)模塊之間的耦合吊骤,把這些耦合關(guān)系全部放到中介者中去實(shí)現(xiàn)缎岗;而外觀模式的目的是簡(jiǎn)化客戶端的調(diào)用,這點(diǎn)和中介者模式也不同白粉。

2.2 外觀模式和單例模式

通常一個(gè)子系統(tǒng)只需要一個(gè)外觀實(shí)例传泊,所以外觀模式可以和單例模式組合使用,把Facade類實(shí)現(xiàn)成為單例鸭巴。當(dāng)然眷细,也可以跟前面示例的那樣,把外觀類的構(gòu)造方法私有化鹃祖,然后把提供給客戶端的方法實(shí)現(xiàn)成為靜態(tài)的

2.3 外觀模式和抽象工廠模式

外觀模式的外觀類通常需要和系統(tǒng)內(nèi)部的多個(gè)模塊交互溪椎,每個(gè)模塊一般都有自己的接口,所以在外觀類的具體實(shí)現(xiàn)里面恬口,需要獲取這些接口校读,然后組合這些接口來(lái)完成客戶端的功能。

那么怎么獲取這些接口呢楷兽?就可以和抽象工廠一起使用地熄,外觀類通過(guò)抽象工廠來(lái)獲取所需要的接口,而抽象工廠也可以把模塊內(nèi)部的實(shí)現(xiàn)對(duì)Facade進(jìn)行屏蔽芯杀,也就是說(shuō)Facade也僅僅只是知道它從模塊中獲取的它需要的功能,模塊內(nèi)部的細(xì)節(jié)雅潭,F(xiàn)acade也不知道了揭厚。

3.適配器模式的相關(guān)模式

3.1 適配器模式與橋接模式

其實(shí)這兩個(gè)模式除了結(jié)構(gòu)略為相似外,功能上完全不同扶供。

適配器模式是把兩個(gè)或者多個(gè)接口的功能進(jìn)行轉(zhuǎn)換匹配筛圆;而橋接模式是讓接口和實(shí)現(xiàn)部分相分離,以便它們可以相對(duì)獨(dú)立的變化椿浓。

3.2 適配器模式與裝飾模式

從某種意義上講太援,適配器模式能模擬實(shí)現(xiàn)簡(jiǎn)單的裝飾模式的功能闽晦,也就是為已有功能增添功能。

造成這種類似的原因:兩種設(shè)計(jì)模式在實(shí)現(xiàn)上都是使用的對(duì)象組合提岔,都可以在轉(zhuǎn)調(diào)組合對(duì)象的功能前后進(jìn)行一些附加的處理仙蛉,因此有這么一個(gè)相似性。它們的目的和本質(zhì)都是不一樣的碱蒙。

兩個(gè)模式有一個(gè)很大的不同:一般適配器適配過(guò)后是需要改變接口的荠瘪,如果不改接口就沒(méi)有必要適配了;而裝飾模式是不改接口的赛惩,無(wú)論多少層裝飾都是一個(gè)接口哀墓。

因此裝飾模式可以很容易的支持遞歸組合,而適配器就做不到了喷兼,每次的接口不同篮绰,沒(méi)法遞歸。

3.3 適配器模式和代理模式

適配器模式可以跟代理模式組合使用季惯,在實(shí)現(xiàn)適配器的時(shí)候阶牍,可以通過(guò)代理來(lái)調(diào)用Adaptee,這可以獲得更大的靈活性

3.4 適配器模式和抽象工廠模式

在適配器實(shí)現(xiàn)的時(shí)候星瘾,通常需要得到被適配的對(duì)象走孽,如果被適配的是一個(gè)接口,那么就可以結(jié)合一些可以創(chuàng)造對(duì)象實(shí)例的設(shè)計(jì)模式琳状,來(lái)得到被適配的對(duì)象示例磕瓷。比如:抽象工廠模式、單例模式念逞、工廠方法模式等

4.單例模式的相關(guān)模式

很多模式都可以使用單例模式困食,只要這些模式中的某個(gè)類,需要控制實(shí)例為一個(gè)的時(shí)候翎承,就可以很自然的使用上單例模式硕盹。比如抽象工廠方法中的具體工廠類就通常是一個(gè)單例。

5.工廠方法模式的相關(guān)模式

5.1 工廠方法模式和抽象工廠模式

這兩個(gè)模式可以組合使用叨咖,具體的放到抽象工廠模式中去講瘩例。

5.2 工廠方法模式和模板方法模式

這兩個(gè)模式外觀類似,都是有一個(gè)抽象類甸各,然后由子類來(lái)提供一些實(shí)現(xiàn)垛贤,但是工廠方法模式的子類專注的是創(chuàng)建產(chǎn)品對(duì)象,而模板方法模式的子類專注的是為固定的算法骨架提供某些步驟的實(shí)現(xiàn)趣倾。

這兩個(gè)模式可以組合使用聘惦,通常在模板方法模式里面,使用工廠方法來(lái)創(chuàng)建模板方法需要的對(duì)象儒恋。

6.抽象工廠模式的相關(guān)模式

6.1 抽象工廠模式和工廠方法模式

這兩個(gè)模式既有區(qū)別善绎,又有聯(lián)系黔漂,可以組合使用。

工廠方法模式一般是針對(duì)單獨(dú)的產(chǎn)品對(duì)象的創(chuàng)建禀酱,而抽象工廠模式注重產(chǎn)品簇對(duì)象的創(chuàng)建炬守,這是它們的區(qū)別。

如果把抽象工廠創(chuàng)建的產(chǎn)品簇簡(jiǎn)化比勉,這個(gè)產(chǎn)品簇就只有一個(gè)產(chǎn)品劳较,那么這個(gè)時(shí)候的抽象工廠跟工廠方法是差不多的,也就是抽象工廠可以退化成工廠方法浩聋,而工廠方法又可以退化成簡(jiǎn)單工廠观蜗,這是它們的聯(lián)系。

在抽象工廠的實(shí)現(xiàn)中衣洁,還可以使用工廠方法來(lái)提供抽象工廠的具體實(shí)現(xiàn)墓捻,也就是說(shuō)它們可以組合使用。

6.2 抽象工廠模式和單例模式

這兩個(gè)模式可以組合使用坊夫。

在抽象工廠模式里面砖第,具體的工廠實(shí)現(xiàn),在整個(gè)應(yīng)用中环凿,通常一個(gè)產(chǎn)品系列只需要一個(gè)實(shí)例就可以了梧兼,因此可以把具體的工廠實(shí)現(xiàn)成為單例。

7.生成器模式的相關(guān)模式

7.1 生成器模式和工廠方法模式

這兩個(gè)模式可以組合使用智听。

生成器模式的Builder實(shí)現(xiàn)中羽杰,通常需要選擇具體的部件實(shí)現(xiàn),一個(gè)可行的方案就是實(shí)現(xiàn)成為工廠方法到推,通過(guò)工廠方法來(lái)獲取具體的部件對(duì)象考赛,然后再進(jìn)行部件的裝配。

7.2 生成器模式和抽象工廠模式

這兩個(gè)模式既相似又有區(qū)別莉测,也可以組合使用

先說(shuō)相似性颜骤,這個(gè)在課程里面已經(jīng)詳細(xì)講述了,這里就不去重復(fù)了捣卤。

再說(shuō)說(shuō)區(qū)別:抽象工廠模式的主要目的是創(chuàng)建產(chǎn)品簇忍抽,這個(gè)產(chǎn)品簇里面的單個(gè)產(chǎn)品,就相當(dāng)于是構(gòu)成一個(gè)復(fù)雜對(duì)象的部件對(duì)象腌零,抽象工廠對(duì)象創(chuàng)建完成過(guò)后就立即返回整個(gè)產(chǎn)品簇梯找;而生成器模式的主要目的是按照構(gòu)造算法,一步一步來(lái)構(gòu)建一個(gè)復(fù)雜的產(chǎn)品對(duì)象益涧,通常要等到整個(gè)構(gòu)建過(guò)程結(jié)束過(guò)后,才會(huì)得到最終的產(chǎn)品對(duì)象驯鳖。

事實(shí)上闲询,這兩個(gè)模式是可以組合使用的久免,在生成器模式的Builder實(shí)現(xiàn)中,需要?jiǎng)?chuàng)建各個(gè)部件對(duì)象扭弧,而這些部件對(duì)象是有關(guān)聯(lián)的阎姥,通常是構(gòu)成一個(gè)復(fù)雜對(duì)象的部件對(duì)象,也就是說(shuō)鸽捻,Builder實(shí)現(xiàn)中呼巴,需要獲取構(gòu)成一個(gè)復(fù)雜對(duì)象的產(chǎn)品簇,那自然就可以使用抽象工廠模式來(lái)實(shí)現(xiàn)御蒲。這樣一來(lái)衣赶,由抽象工廠模式負(fù)責(zé)了部件對(duì)象的創(chuàng)建,Builder實(shí)現(xiàn)里面就主要負(fù)責(zé)產(chǎn)品對(duì)象整體的構(gòu)建了厚满。

7.3 生成器模式和模板方法模式

這也是兩個(gè)非常類似的模式府瞄。初看之下,不會(huì)覺(jué)得這兩個(gè)模式有什么關(guān)聯(lián)碘箍,但是仔細(xì)一思考遵馆,發(fā)現(xiàn)兩個(gè)模式在功能上很類似。

模板方法模式主要是用來(lái)定義算法的骨架丰榴,把算法中某些步驟延遲到子類中實(shí)現(xiàn)货邓。再想想生成器模式,Director用來(lái)定義整體的構(gòu)建算法四濒,把算法中某些涉及到具體部件對(duì)象的創(chuàng)建和裝配的功能换况,委托給具體的Builder來(lái)實(shí)現(xiàn)。

雖然生成器不是延遲到子類峻黍,是委托給Builder复隆,但那只是具體實(shí)現(xiàn)方式上的差別,從實(shí)質(zhì)上看兩個(gè)模式很類似姆涩,都是定義一個(gè)固定的算法骨架挽拂,然后把算法中的某些具體步驟交給其它類來(lái)完成,都能實(shí)現(xiàn)整體算法步驟和某些具體步驟實(shí)現(xiàn)的分離骨饿。

當(dāng)然兩個(gè)模式也有很大的區(qū)別亏栈,首先是模式的目的,生成器模式是用來(lái)構(gòu)建復(fù)雜對(duì)象的宏赘,而模板方法是用來(lái)定義算法骨架绒北,尤其是一些復(fù)雜的業(yè)務(wù)功能的處理算法的骨架;其次是模式的實(shí)現(xiàn)察署,生成器模式是采用委托的方法闷游,而模板方法是采用的繼承的方式;另外從使用的復(fù)雜度上,生成器模式需要組合Director和Builder對(duì)象脐往,然后才能開(kāi)始構(gòu)建休吠,要等構(gòu)建完后才能獲得最終的對(duì)象,而模板方法就沒(méi)有這么麻煩业簿,直接使用子類對(duì)象即可瘤礁。

7.4 生成器模式和組合模式

這兩個(gè)模式可以組合使用。

對(duì)于復(fù)雜的組合結(jié)構(gòu)梅尤,可以使用生成器模式來(lái)一步一步構(gòu)建柜思。

8.原型模式的相關(guān)模式

8.1 原型模式和抽象工廠模式

功能上有些相似,都是用來(lái)獲取一個(gè)新的對(duì)象實(shí)例的巷燥。

不同之處在于赡盘,原型模式的著眼點(diǎn)是在如何創(chuàng)造出實(shí)例對(duì)象來(lái),最后選擇的方案是通過(guò)克路取亡脑;而抽象工廠模式的著眼點(diǎn)則在于如何來(lái)創(chuàng)造產(chǎn)品簇,至于具體如何創(chuàng)建出產(chǎn)品簇中的每個(gè)對(duì)象實(shí)例邀跃,抽象工廠模式不是很關(guān)注霉咨。

正是因?yàn)樗鼈兊年P(guān)注點(diǎn)不一樣,所以它們也可以配合使用拍屑,比如在抽象工廠模式里面途戒,具體創(chuàng)建每一種產(chǎn)品的時(shí)候就可以使用該種產(chǎn)品的原型,也就是抽象工廠管產(chǎn)品簇僵驰,具體的每種產(chǎn)品怎么創(chuàng)建則可以選擇原型模式喷斋。

8.2 原型模式和生成器模式

這兩種模式可以配合使用。

生成器模式關(guān)注的是構(gòu)建的過(guò)程蒜茴,而在構(gòu)建的過(guò)程中星爪,很可能需要某個(gè)部件的實(shí)例,那么很自然地就可以應(yīng)用上原型模式粉私,通過(guò)原型模式來(lái)得到部件的實(shí)例顽腾。

9.中介者模式的相關(guān)模式

9.1 中介者模式和外觀模式

這兩個(gè)模式有相似的地方,也存在很大的不同诺核。

外觀模式多用來(lái)封裝一個(gè)子系統(tǒng)內(nèi)部的多個(gè)模塊抄肖,目的是向子系統(tǒng)外部提供簡(jiǎn)單易用的接口,也就是說(shuō)外觀模式封裝的是子系統(tǒng)外部和子系統(tǒng)內(nèi)部模塊間的交互窖杀;而中介者模式是提供多個(gè)平等的同事對(duì)象之間交互關(guān)系的封裝漓摩,一般是用在內(nèi)部實(shí)現(xiàn)上。

另外入客,外觀模式是實(shí)現(xiàn)單向的交互管毙,是從子系統(tǒng)外部來(lái)調(diào)用子系統(tǒng)內(nèi)部腿椎,不會(huì)反著來(lái),而中介者模式實(shí)現(xiàn)的是內(nèi)部多個(gè)模塊間多向的交互锅风。

9.2 中介者模式和觀察者模式

這兩個(gè)模式可以組合使用酥诽。

中介者模式可以組合使用觀察者模式鞍泉,來(lái)實(shí)現(xiàn)當(dāng)同事對(duì)象發(fā)生改變的時(shí)候皱埠,通知中介對(duì)象,讓中介對(duì)象去進(jìn)行與其它相關(guān)對(duì)象的交互咖驮。

10.代理模式的相關(guān)模式

10.1 代理模式和適配器模式

這兩個(gè)模式有一定的相似性边器,但也有差異。

這兩個(gè)模式有相似性托修,它們都為另一個(gè)對(duì)象提供間接性的訪問(wèn)忘巧,而且都是從自身以外的一個(gè)接口向這個(gè)對(duì)象轉(zhuǎn)發(fā)請(qǐng)求。

但是從功能上睦刃,兩個(gè)模式是不一樣的砚嘴。適配器模式主要用來(lái)解決接口之間不匹配的問(wèn)題,它通常是為所適配的對(duì)象提供一個(gè)不同的接口涩拙;而代理模式會(huì)實(shí)現(xiàn)和目標(biāo)對(duì)象相同的接口际长。

10.2 代理模式和裝飾模式

這兩個(gè)模式從實(shí)現(xiàn)上相似,但是功能上是不同的兴泥。

裝飾模式的實(shí)現(xiàn)和保護(hù)代理的實(shí)現(xiàn)上是類似的工育,都是在轉(zhuǎn)調(diào)其它對(duì)象的前后執(zhí)行一定的功能。但是它們的目的和功能都是不同的搓彻。

裝飾模式的目的是為了讓你不生成子類就可以給對(duì)象添加職責(zé)如绸,也就是為了動(dòng)態(tài)的增加功能;而代理模式的主要目的是控制對(duì)對(duì)象的訪問(wèn)旭贬。

11.觀察者模式的相關(guān)模式

11.1 觀察者模式和狀態(tài)模式

觀察者模式和狀態(tài)模式是有相似之處的怔接。

觀察者模式是當(dāng)目標(biāo)狀態(tài)發(fā)生改變時(shí),觸發(fā)并通知觀察者稀轨,讓觀察者去執(zhí)行相應(yīng)的操作扼脐。而狀態(tài)模式是根據(jù)不同的狀態(tài),選擇不同的實(shí)現(xiàn)靶端,這個(gè)實(shí)現(xiàn)類的主要功能就是針對(duì)狀態(tài)的相應(yīng)的操作谎势,它不像觀察者,觀察者本身還有很多其它的功能杨名,接收通知并執(zhí)行相應(yīng)處理只是觀察者的部分功能脏榆。

當(dāng)然觀察者模式和狀態(tài)模式是可以結(jié)合使用的。觀察者模式的重心在觸發(fā)聯(lián)動(dòng)台谍,但是到底決定哪些觀察者會(huì)被聯(lián)動(dòng)须喂,這時(shí)就可以采用狀態(tài)模式來(lái)實(shí)現(xiàn)了,也可以采用策略模式來(lái)進(jìn)行選擇需要聯(lián)動(dòng)的觀察者。

11.2 觀察者模式和中介者模式

觀察者模式和中介者模式是可以結(jié)合使用的坞生。

前面的例子中目標(biāo)都只是簡(jiǎn)單的通知一下仔役,然后讓各個(gè)觀察者自己去完成更新就結(jié)束了。如果觀察者和被觀察的目標(biāo)之間的交互關(guān)系很復(fù)雜是己,比如:有一個(gè)界面又兵,里面有三個(gè)下拉列表組件,分別是選擇國(guó)家卒废、省份/州沛厨、具體的城市,很明顯這是一個(gè)三級(jí)聯(lián)動(dòng)摔认,當(dāng)你選擇一個(gè)國(guó)家的時(shí)候逆皮,省份/州應(yīng)該相應(yīng)改變數(shù)據(jù),省份/州一改變参袱,具體的城市也需要改變电谣。

這種情況下,很明顯需要相關(guān)的狀態(tài)都聯(lián)動(dòng)準(zhǔn)備好了抹蚀,然后再一次性的通知觀察者剿牺,就是界面做更新處理,不會(huì)國(guó)家改變一下况鸣,省份和城市還沒(méi)有改牢贸,就通知界面更新。這種情況就可以使用中介者模式來(lái)封裝觀察者和目標(biāo)的關(guān)系镐捧。

在使用Swing的小型應(yīng)用里面潜索,也可以使用中介者模式。比如:把一個(gè)界面所有的事件用一個(gè)對(duì)象來(lái)處理懂酱,把一個(gè)組件觸發(fā)事件過(guò)后竹习,需要操作其它組件的動(dòng)作都封裝到一起,這個(gè)對(duì)象就是典型的中介者列牺。

12.命令模式的相關(guān)模式

12.1 命令模式和組合模式

這兩個(gè)模式可以組合使用整陌。

在命令模式中,實(shí)現(xiàn)宏命令的功能瞎领,就可以使用組合模式來(lái)實(shí)現(xiàn)泌辫。前面的示例并沒(méi)有按照組合模式來(lái)做,那是為了保持示例的簡(jiǎn)單九默,還有突出命令模式的實(shí)現(xiàn)震放,這點(diǎn)請(qǐng)注意。

12.2 命令模式和備忘錄模式

這兩個(gè)模式可以組合使用驼修。

在命令模式中殿遂,實(shí)現(xiàn)可撤銷操作功能時(shí)诈铛,前面講了有兩種實(shí)現(xiàn)方式,其中有一種就是保存命令執(zhí)行前的狀態(tài)墨礁,撤銷的時(shí)候就把狀態(tài)恢復(fù)回去幢竹。如果采用這種方式實(shí)現(xiàn),就可以考慮使用備忘錄模式恩静。

如果狀態(tài)存儲(chǔ)在命令對(duì)象里面焕毫,那么還可以使用原型模式,把命令對(duì)象當(dāng)作原型來(lái)克隆一個(gè)新的對(duì)象蜕企,然后把克隆出來(lái)的對(duì)象通過(guò)備忘錄模式存放咬荷。

12.3 命令模式和模板方法模式

這兩個(gè)模式從某種意義上有相似的功能,命令模式可以作為模板方法的一種替代模式轻掩,也就是說(shuō)命令模式可以模仿實(shí)現(xiàn)模板方法模式的功能。

如同前面講述的退化的命令模式可以實(shí)現(xiàn)Java的回調(diào)懦底,而Invoker智能化后向服務(wù)進(jìn)化唇牧,如果Invoker的方法就是一個(gè)算法骨架,其中有兩步在這個(gè)骨架里面沒(méi)有具體實(shí)現(xiàn)聚唐,需要外部來(lái)實(shí)現(xiàn)丐重,這個(gè)時(shí)候就可以通過(guò)回調(diào)命令接口來(lái)實(shí)現(xiàn)。而類似的功能在模板方法里面杆查,一個(gè)算法骨架扮惦,其中有兩步在這個(gè)骨架里面沒(méi)有具體實(shí)現(xiàn),是先調(diào)用抽象方法亲桦,然后等待子類來(lái)實(shí)現(xiàn)崖蜜。

可以看出雖然實(shí)現(xiàn)方式不一樣,但是可以實(shí)現(xiàn)相同的功能客峭。

13.迭代器模式的相關(guān)模式

13.1 迭代器模式和組合模式

這兩個(gè)模式可以組合使用豫领。

組合模式是一種遞歸的對(duì)象結(jié)構(gòu),在枚舉某個(gè)組合對(duì)象的子對(duì)象的時(shí)候舔琅,通常會(huì)使用迭代器模式等恐。

13.2 迭代器模式和工廠方法模式

這兩個(gè)模式可以組合使用。

在聚合對(duì)象創(chuàng)建迭代器的時(shí)候备蚓,通常會(huì)采用工廠方法模式來(lái)實(shí)例化相應(yīng)的迭代器對(duì)象课蔬。

14.組合模式的相關(guān)模式

14.1 組合模式和裝飾模式

這兩個(gè)模式可以組合使用。

裝飾模式在組裝多個(gè)裝飾器對(duì)象的時(shí)候郊尝,是一個(gè)裝飾器找下一個(gè)裝飾器二跋,下一個(gè)再找下一個(gè),如此遞歸下去虚循。那么這種結(jié)構(gòu)也可以使用組合模式來(lái)幫助構(gòu)建同欠,這樣一來(lái)样傍,裝飾器對(duì)象就相當(dāng)于組合模式的Composite對(duì)象了。

要讓兩個(gè)模式能很好的組合使用铺遂,通常會(huì)讓它們有一個(gè)公共的父類衫哥,因此裝飾器必須支持組合模式需要的一些功能,比如:增加襟锐、刪除子組件等等撤逢。

14.2 組合模式和享元模式

這兩個(gè)模式可以組合使用。

如果組合模式中出現(xiàn)大量相似的組件對(duì)象的話粮坞,可以考慮使用享元模式來(lái)幫助緩存組件對(duì)象蚊荣,這可以減少對(duì)內(nèi)存的需要。

使用享元模式也是有條件的莫杈,如果組件對(duì)象的可變化部分的狀態(tài)能夠從組件對(duì)象里面分離出去互例,而且組件對(duì)象本身不需要向父組件發(fā)送請(qǐng)求的話,就可以采用享元模式筝闹。

14.3 組合模式和迭代器模式

這兩個(gè)模式可以組合使用媳叨。

在組合模式中,通彻厍辏可以使用迭代器模式來(lái)遍歷組合對(duì)象的子對(duì)象集合糊秆,而無(wú)需關(guān)心具體存放子對(duì)象的聚合結(jié)構(gòu)。

14.4 組合模式和訪問(wèn)者模式

這兩個(gè)模式可以組合使用议双。

訪問(wèn)者模式能夠在不修改原有對(duì)象結(jié)構(gòu)的情況下痘番,給對(duì)象結(jié)構(gòu)中的對(duì)象增添新的功能。將訪問(wèn)者模式和組合模式合用平痰,可以把原本分散在Composite和 Leaf類中的操作和行為都局部化汞舱。

如果在使用組合模式的時(shí)候,預(yù)計(jì)到今后可能會(huì)有增添其它功能的可能觉增,那么可以采用訪問(wèn)者模式兵拢,來(lái)預(yù)留好添加新功能的方式和通道,這樣以后在添加新功能的時(shí)候逾礁,就不需要再修改已有的對(duì)象結(jié)構(gòu)和已經(jīng)實(shí)現(xiàn)的功能了说铃。

14.5 組合模式和職責(zé)鏈模式

這兩個(gè)模式可以組合使用。

職責(zé)鏈模式要解決的問(wèn)題是:實(shí)現(xiàn)請(qǐng)求的發(fā)送者和接收者之間解耦嘹履。職責(zé)鏈模式的實(shí)現(xiàn)方式是把多個(gè)接收者組合起來(lái)腻扇,構(gòu)成職責(zé)鏈,然后讓請(qǐng)求在這條鏈上傳遞砾嫉,直到有接收者處理這個(gè)請(qǐng)求為止幼苛。

可以應(yīng)用組合模式來(lái)構(gòu)建這條鏈,相當(dāng)于是子組件找父組件焕刮,父組件又找父組件舶沿,如此遞歸下去墙杯,構(gòu)成一條處理請(qǐng)求的組件對(duì)象鏈。

14.6 組合模式和命令模式

這兩個(gè)模式可以組合使用括荡。

命令模式中有一個(gè)宏命令的功能高镐,通常這個(gè)宏命令就是使用組合模式來(lái)組裝出來(lái)的。

15.模板方法模式的相關(guān)模式

15.1 模板方法模式和工廠方法模式

這兩個(gè)模式可以配合使用畸冲。

模板方法模式可以通過(guò)工廠方法來(lái)獲取需要調(diào)用的對(duì)象嫉髓。

15.2 模板方法模式和策略模式

這兩個(gè)模式的功能有些相似,但是是有區(qū)別的邑闲。

從表面上看算行,兩個(gè)模式都能實(shí)現(xiàn)算法的封裝,但是模板方法封裝的是算法的骨架苫耸,這個(gè)算法骨架是不變的州邢,變化的是算法中某些步驟的具體實(shí)現(xiàn);而策略模式是把某個(gè)步驟的具體實(shí)現(xiàn)算法封裝起來(lái)鲸阔,所有封裝的算法對(duì)象是等價(jià)的偷霉,可以相互替換。

因此褐筛,可以在模板方法中使用策略模式,就是把那些變化的算法步驟通過(guò)使用策略模式來(lái)實(shí)現(xiàn)叙身,但是具體選取哪個(gè)策略還是要由外部來(lái)確定渔扎,而整體的算法步驟,也就是算法骨架就由模板方法來(lái)定義了信轿。

16.策略模式的相關(guān)模式

16.1 策略模式和狀態(tài)模式

這兩個(gè)模式從模式結(jié)構(gòu)上看是一樣的晃痴,但是實(shí)現(xiàn)的功能是不一樣的。

狀態(tài)模式是根據(jù)狀態(tài)的變化來(lái)選擇相應(yīng)的行為财忽,不同的狀態(tài)對(duì)應(yīng)不同的類倘核,每個(gè)狀態(tài)對(duì)應(yīng)的類實(shí)現(xiàn)了該狀態(tài)對(duì)應(yīng)的功能,在實(shí)現(xiàn)功能的同時(shí)即彪,還會(huì)維護(hù)狀態(tài)數(shù)據(jù)的變化紧唱。這些實(shí)現(xiàn)狀態(tài)對(duì)應(yīng)的功能的類之間是不能相互替換的。策略模式是根據(jù)需要或者是客戶端的要求來(lái)選擇相應(yīng)的實(shí)現(xiàn)類隶校,各個(gè)實(shí)現(xiàn)類是平等的漏益,是可以相互替換的。

另外策略模式可以讓客戶端來(lái)選擇需要使用的策略算法深胳,而狀態(tài)模式一般是由上下文绰疤,或者是在狀態(tài)實(shí)現(xiàn)類里面來(lái)維護(hù)具體的狀態(tài)數(shù)據(jù),通常不由客戶端來(lái)指定狀態(tài)舞终。

16.2 策略模式和模板方法模式

這兩個(gè)模式可組合使用轻庆,如同前面示例的那樣癣猾。

模板方法重在封裝算法骨架,而策略模式重在分離并封裝算法實(shí)現(xiàn)余爆。

16.3 策略模式和享元模式

這兩個(gè)模式可組合使用纷宇。

策略模式分離并封裝出一系列的策略算法對(duì)象,這些對(duì)象的功能通常都比較單一龙屉,很多時(shí)候就是為了實(shí)現(xiàn)某個(gè)算法的功能而存在呐粘,因此,針對(duì)這一系列的转捕、多個(gè)細(xì)粒度的對(duì)象作岖,可以應(yīng)用享元模式來(lái)節(jié)省資源,但前提是這些算法對(duì)象要被頻繁的使用五芝,如果偶爾用一次痘儡,就沒(méi)有必要做成享元了。

17.狀態(tài)模式的相關(guān)模式

17.1 狀態(tài)模式和觀察者模式

這兩個(gè)模式乍一看枢步,功能是很相似的沉删,但是又有區(qū)別,可以組合使用醉途。

模式都是在狀態(tài)發(fā)生改變的時(shí)候觸發(fā)行為矾瑰,只不過(guò)觀察者模式的行為是固定的,那就是通知所有的觀察者隘擎,而狀態(tài)模式是根據(jù)狀態(tài)來(lái)選擇不同的處理殴穴。

從表面來(lái)看兩個(gè)模式功能相似,觀察者中的被觀察對(duì)象就好比狀態(tài)模式中的上下文货葬,觀察者模式中當(dāng)被觀察對(duì)象的狀態(tài)發(fā)生改變的時(shí)候采幌,觸發(fā)的通知所有觀察者的方法;就好比狀態(tài)模式中震桶,根據(jù)狀態(tài)的變化休傍,選擇對(duì)應(yīng)的狀態(tài)處理。

但實(shí)際這兩個(gè)模式是不同的蹲姐,觀察者模式的目的是在被觀察者的狀態(tài)發(fā)生改變的時(shí)候磨取,觸發(fā)觀察者聯(lián)動(dòng),具體如何處理觀察者模式不管淤堵;而狀態(tài)模式的主要目的在于根據(jù)狀態(tài)來(lái)分離和選擇行為寝衫,當(dāng)狀態(tài)發(fā)生改變的時(shí)候,動(dòng)態(tài)改變行為拐邪。

這兩個(gè)模式是可以組合使用的慰毅,比如在觀察者模式的觀察者部分,當(dāng)被觀察對(duì)象的狀態(tài)發(fā)生了改變扎阶,觸發(fā)通知了所有的觀察者過(guò)后汹胃,觀察者該怎么處理呢婶芭?這個(gè)時(shí)候就可以使用狀態(tài)模式,根據(jù)通知過(guò)來(lái)的狀態(tài)選擇相應(yīng)的處理着饥。

17.2 狀態(tài)模式和策略模式

這是兩個(gè)結(jié)構(gòu)相同犀农,功能各異的模式,具體的在策略模式里面講過(guò)了宰掉,這里不再贅述呵哨。

17.3 狀態(tài)模式和單例模式

這兩個(gè)模式可以組合使用,可以把狀態(tài)模式中的狀態(tài)處理類實(shí)現(xiàn)成單例轨奄。

17.4 狀態(tài)模式和享元模式

這兩個(gè)模式可以組合使用孟害。

由于狀態(tài)模式把狀態(tài)對(duì)應(yīng)的行為分散到多個(gè)狀態(tài)對(duì)象中,會(huì)造成很多細(xì)粒度的狀態(tài)對(duì)象挪拟,可以把這些狀態(tài)處理對(duì)象通過(guò)享元模式來(lái)共享挨务,從而節(jié)省資源。

18.備忘錄模式的相關(guān)模式

18.1 備忘錄模式和命令模式

這兩個(gè)模式可以組合使用玉组。

命令模式實(shí)現(xiàn)中谎柄,在實(shí)現(xiàn)命令的撤銷和重做的時(shí)候,可以使用備忘錄模式惯雳,在命令操作的時(shí)候記錄下操作前后的狀態(tài)朝巫,然后在命令撤銷和重做的時(shí)候,直接使用相應(yīng)的備忘錄對(duì)象來(lái)恢復(fù)狀態(tài)就可以了石景。

在這種撤銷的執(zhí)行順序和重做執(zhí)行順序可控的情況下捍歪,備忘錄對(duì)象還可以采用增量式記錄的方式,可以減少緩存的數(shù)據(jù)量鸵钝。

18.2 備忘錄模式和原型模式

這兩個(gè)模式可以組合使用。

在原發(fā)器對(duì)象創(chuàng)建備忘錄對(duì)象的時(shí)候庐镐,如果原發(fā)器對(duì)象中全部或者大部分的狀態(tài)都需要保存恩商,一個(gè)簡(jiǎn)潔的方式就是直接克隆一個(gè)原發(fā)器對(duì)象。也就是說(shuō)必逆,這個(gè)時(shí)候備忘錄對(duì)象里面存放的是一個(gè)原發(fā)器對(duì)象的實(shí)例怠堪,這個(gè)在前面已經(jīng)示例過(guò)了,這里就不贅述了名眉。

19.享元模式的相關(guān)模式

19.1 享元模式與單例模式

這兩個(gè)模式可以組合使用粟矿。

通常情況下,享元模式中的享元工廠可以實(shí)現(xiàn)成為單例损拢。另外陌粹,享元工廠里面緩存的享元對(duì)象,都是單實(shí)例的福压,可以看成是單例模式的一種變形控制掏秩,在享元工廠里面來(lái)單例享元對(duì)象或舞。

19.2 享元模式與組合模式

這兩個(gè)模式可以組合使用。

在享元模式里面蒙幻,存在不需要共享的享元實(shí)現(xiàn)映凳,這些不需要共享的享元通常是對(duì)共享的享元對(duì)象的組合對(duì)象,也就是說(shuō)邮破,享元模式通常會(huì)和組合模式組合使用塌忽,來(lái)實(shí)現(xiàn)更復(fù)雜的對(duì)象層次結(jié)構(gòu)。

19.3 享元模式與狀態(tài)模式

這兩個(gè)模式可以組合使用础米。

可以使用享元模式來(lái)共享狀態(tài)模式中的狀態(tài)對(duì)象佃迄,通常在狀態(tài)模式中,會(huì)存在數(shù)量很大的构诚、細(xì)粒度的狀態(tài)對(duì)象蚌斩,而且它們基本上都是可以重復(fù)使用的,都是用來(lái)處理某一個(gè)固定的狀態(tài)的范嘱,它們需要的數(shù)據(jù)通常都是由上下文傳入送膳,也就是變化部分都分離出去了,所以可以用享元模式來(lái)實(shí)現(xiàn)這些狀態(tài)對(duì)象丑蛤。

19.4 享元模式與策略模式

這兩個(gè)模式可以組合使用叠聋。

可以使用享元模式來(lái)實(shí)現(xiàn)策略模式中的策略對(duì)象,跟狀態(tài)模式一樣受裹,在策略模式中也存在大量細(xì)粒度的策略對(duì)象碌补,它們需要的數(shù)據(jù)同樣是從上下文傳入的,所以可以使用享元模式來(lái)實(shí)現(xiàn)這些策略對(duì)象

20.解釋器模式的相關(guān)模式

20.1 解釋器模式和組合模式

這兩個(gè)模式可以組合使用棉饶。

通常解釋器模式都會(huì)使用組合模式來(lái)實(shí)現(xiàn)厦章,這樣能夠方便的構(gòu)建抽象語(yǔ)法樹(shù)。一般非終結(jié)符解釋器就相當(dāng)于組合模式中的組合對(duì)象照藻,終結(jié)符解釋器就相當(dāng)于葉子對(duì)象袜啃。

20.2 解釋器模式和迭代器模式

這兩個(gè)模式可以組合使用。

由于解釋器模式通常使用組合模式來(lái)實(shí)現(xiàn)幸缕,因此在遍歷整個(gè)對(duì)象結(jié)構(gòu)的時(shí)候群发,自然可以使用迭代器模式。

20.3 解釋器模式和享元模式

這兩個(gè)模式可以組合使用发乔。

在使用解釋器模式的時(shí)候熟妓,可能會(huì)造成多個(gè)細(xì)粒度對(duì)象,比如會(huì)有各種各樣的終結(jié)符解釋器栏尚,而這些終結(jié)符解釋器對(duì)不同的表達(dá)式來(lái)說(shuō)是一樣的起愈,是可以共用的,因此可以引入享元模式來(lái)共享這些對(duì)象。

20.4 解釋器模式和訪問(wèn)者模式

這兩個(gè)模式可以組合使用告材。

在解釋器模式中坤次,語(yǔ)法規(guī)則和解釋器對(duì)象是有對(duì)應(yīng)關(guān)系的。語(yǔ)法規(guī)則的變動(dòng)意味著功能的變化斥赋,自然會(huì)導(dǎo)致使用不同的解釋器對(duì)象缰猴;而且一個(gè)語(yǔ)法規(guī)則可以被不同的解釋器解釋執(zhí)行。

因此在構(gòu)建抽象語(yǔ)法樹(shù)的時(shí)候疤剑,如果每個(gè)節(jié)點(diǎn)所對(duì)應(yīng)的解釋器對(duì)象是固定的滑绒,這就意味著這個(gè)節(jié)點(diǎn)對(duì)應(yīng)的功能是固定的,那么就不得不根據(jù)需要來(lái)構(gòu)建不同的抽象語(yǔ)法樹(shù)隘膘。

為了讓構(gòu)建的抽象語(yǔ)法樹(shù)較為通用疑故,那就要求解釋器的功能不要那么固定,要能很方便的改變解釋器的功能弯菊,這個(gè)時(shí)候問(wèn)題就變成了纵势,如何能夠很方便的更改樹(shù)形結(jié)構(gòu)中節(jié)點(diǎn)對(duì)象的功能了,訪問(wèn)者模式可以很好的實(shí)現(xiàn)這個(gè)功能管钳。

21.裝飾模式的相關(guān)模式

21.1 裝飾模式與適配器模式

這是兩個(gè)沒(méi)有什么關(guān)聯(lián)的模式钦铁,放到一起來(lái)說(shuō),是因?yàn)樗鼈冇幸粋€(gè)共同的別名:Wrapper才漆。

這兩個(gè)模式功能上是不一樣的牛曹,適配器模式是用來(lái)改變接口的,而裝飾模式是用來(lái)改變對(duì)象功能的醇滥。

21.2 裝飾模式與組合模式

這兩個(gè)模式有相似之處黎比,都涉及到對(duì)象的遞歸調(diào)用,從某個(gè)角度來(lái)說(shuō)鸳玩,可以把裝飾看成是只有一個(gè)組件的組合阅虫。

但是它們的目的完全不一樣,裝飾模式是要?jiǎng)討B(tài)的給對(duì)象增加功能不跟;而組合模式是想要管理組合對(duì)象和葉子對(duì)象书妻,為它們提供一個(gè)一致的操作接口給客戶端,方便客戶端的使用躬拢。

21.3 裝飾模式與策略模式

這兩個(gè)模式可以組合使用。

策略模式也可以實(shí)現(xiàn)動(dòng)態(tài)的改變對(duì)象的功能见间,但是策略模式只是一層選擇聊闯,也就是根據(jù)策略選擇一下具體的實(shí)現(xiàn)類而已。而裝飾模式不是一層米诉,而是遞歸調(diào)用菱蔬,無(wú)數(shù)層都可以,只要組合好裝飾器的對(duì)象組合,那就可以依次調(diào)用下去拴泌,所以裝飾模式會(huì)更靈活魏身。

而且策略模式改變的是原始對(duì)象的功能,不像裝飾模式蚪腐,后面一個(gè)裝飾器箭昵,改變的是經(jīng)過(guò)前一個(gè)裝飾器裝飾過(guò)后的對(duì)象,也就是策略模式改變的是對(duì)象的內(nèi)核回季,而裝飾模式改變的是對(duì)象的外殼家制。

這兩個(gè)模式可以組合使用,可以在一個(gè)具體的裝飾器里面使用策略模式泡一,來(lái)選擇更具體的實(shí)現(xiàn)方式颤殴。比如前面計(jì)算獎(jiǎng)金的另外一個(gè)問(wèn)題就是參與計(jì)算的基數(shù)不同,獎(jiǎng)金的計(jì)算方式也是不同的鼻忠。舉例來(lái)說(shuō):假設(shè)張三和李四參與同一個(gè)獎(jiǎng)金的計(jì)算涵但,張三的銷售總額是2萬(wàn)元,而李四的銷售額是8萬(wàn)元帖蔓,它們的計(jì)算公式是不一樣的矮瘟,假設(shè)獎(jiǎng)金的計(jì)算規(guī)則是,銷售額在5萬(wàn)以下讨阻,統(tǒng)一3%芥永,而5萬(wàn)以上,5萬(wàn)內(nèi)是4%钝吮,超過(guò)部分是6%埋涧。

參與同一個(gè)獎(jiǎng)金的計(jì)算,這就意味著可以使用同一個(gè)裝飾器奇瘦,但是在裝飾器的內(nèi)部棘催,不同條件下計(jì)算公式不一樣,那么怎么選擇具體的實(shí)現(xiàn)策略呢耳标?自然使用策略模式就好了醇坝,也就是裝飾模式和策略模式組合來(lái)使用。

21.4 裝飾模式與模板方法模式

這是兩個(gè)功能上有相似點(diǎn)的模式次坡。

模板方法模式主要應(yīng)用在算法骨架固定的情況呼猪,那么要是算法步驟不固定呢,也就是一個(gè)相對(duì)動(dòng)態(tài)的算法步驟砸琅,就可以使用裝飾模式了宋距,因?yàn)樵谑褂醚b飾模式的時(shí)候,進(jìn)行裝飾器的組裝症脂,其實(shí)也相當(dāng)于是一個(gè)調(diào)用算法步驟的組裝谚赎,相當(dāng)于是一個(gè)動(dòng)態(tài)的算法骨架淫僻。

既然裝飾模式可以實(shí)現(xiàn)動(dòng)態(tài)的算法步驟的組裝和調(diào)用,那么把這些算法步驟固定下來(lái)壶唤,那就是模板方法模式實(shí)現(xiàn)的功能了雳灵,因此裝飾模式可以模擬實(shí)現(xiàn)模板方法模式的功能。

但是請(qǐng)注意闸盔,僅僅只是可以模擬功能而已悯辙,兩個(gè)模式的設(shè)計(jì)目的、原本的功能蕾殴、本質(zhì)思想等都是不一樣的笑撞。

22.職責(zé)鏈模式的相關(guān)模式

22.1 職責(zé)鏈模式和組合模式

這兩個(gè)模式可以組合使用。

可以把職責(zé)對(duì)象通過(guò)組合模式來(lái)組合钓觉,這樣可以通過(guò)組合對(duì)象自動(dòng)遞歸的向上調(diào)用茴肥,由父組件作為子組件的后繼,從而形成鏈荡灾。這也就是前面提到過(guò)的使用外部已有的鏈接瓤狐,這種情況在客戶端使用的時(shí)候,就不用再構(gòu)造鏈了批幌,雖然不構(gòu)造鏈础锐,但是需要構(gòu)造組合對(duì)象樹(shù),是一樣的荧缘。

22.2 職責(zé)鏈模式和策略模式

這兩個(gè)模式可以組合使用皆警。

這兩個(gè)模式有相似之處,如果把職責(zé)鏈簡(jiǎn)化到直接就能選擇到相應(yīng)的處理對(duì)象截粗,那就跟策略模式的選擇差不多信姓,因此可以用職責(zé)鏈來(lái)模擬策略模式的功能。只是如果把職責(zé)鏈簡(jiǎn)化到這個(gè)地步绸罗,也就不存在鏈了意推,也就稱不上是職責(zé)鏈了。

兩個(gè)模式可以組合使用珊蟀,可以在職責(zé)鏈模式的某個(gè)職責(zé)的實(shí)現(xiàn)的時(shí)候菊值,使用策略模式來(lái)選擇具體的實(shí)現(xiàn),同樣也可以在策略模式的某個(gè)策略實(shí)現(xiàn)里面育灸,使用職責(zé)鏈模式來(lái)實(shí)現(xiàn)功能處理腻窒。

同理職責(zé)鏈模式也可以和狀態(tài)模式組合使用。

22.3 職責(zé)鏈模式和裝飾模式

這兩個(gè)模式相似磅崭,從某個(gè)角度講定页,可以相互模擬實(shí)現(xiàn)對(duì)方的功能。

裝飾模式能夠動(dòng)態(tài)的給被裝飾對(duì)象添加功能绽诚,要求裝飾器對(duì)象和被裝飾的對(duì)象實(shí)現(xiàn)相同的接口。而職責(zé)鏈模式可以實(shí)現(xiàn)動(dòng)態(tài)的職責(zé)組合,標(biāo)準(zhǔn)的功能是有一個(gè)對(duì)象處理就結(jié)束恩够,但是如果處理完本職責(zé)不急于結(jié)束卒落,而是繼續(xù)向下傳遞請(qǐng)求,那么功能就和裝飾模式的功能差不多了蜂桶,每個(gè)職責(zé)對(duì)象就類似于裝飾器儡毕,可以實(shí)現(xiàn)某種功能。

而且兩個(gè)模式的本質(zhì)也類似扑媚,都需要在運(yùn)行期間動(dòng)態(tài)組合腰湾,裝飾模式是動(dòng)態(tài)組合裝飾器,而職責(zé)鏈?zhǔn)莿?dòng)態(tài)組合處理請(qǐng)求的職責(zé)對(duì)象的鏈疆股。

但是從標(biāo)準(zhǔn)的設(shè)計(jì)模式上來(lái)講费坊,這兩個(gè)模式還是有較大區(qū)別的,這點(diǎn)要注意旬痹。首先是目的不同附井,裝飾模式是要實(shí)現(xiàn)透明的為對(duì)象添加功能,而職責(zé)鏈模式是要實(shí)現(xiàn)發(fā)送者和接收者解耦两残;另外一個(gè)永毅,裝飾模式是無(wú)限遞歸調(diào)用的,可以有任意多個(gè)對(duì)象來(lái)裝飾功能人弓,但是職責(zé)鏈模式是有一個(gè)處理就結(jié)束沼死。

23.橋接模式的相關(guān)模式

23.1 橋接模式和策略模式

這兩個(gè)模式有很大的相似之處。

如果把橋接模式的抽象部分簡(jiǎn)化來(lái)看崔赌,如果暫時(shí)不去擴(kuò)展Abstraction意蛀,也就是去掉 RefinedAbstraction。會(huì)發(fā)現(xiàn)峰鄙,這個(gè)時(shí)候它們的結(jié)構(gòu)都類似如圖所示:


通過(guò)上面的結(jié)構(gòu)圖浸间,可以體會(huì)到橋接模式和策略模式是如此相似∫髁瘢可以把策略模式的Context視做是使用接口的對(duì)象魁蒜,而Strategy就是某個(gè)接口了,具體的策略實(shí)現(xiàn)那就相當(dāng)于接口的具體實(shí)現(xiàn)吩翻。這樣看來(lái)的話兜看,某些情況下,可以使用橋接模式來(lái)模擬實(shí)現(xiàn)策略模式的功能狭瞎。

這兩個(gè)模式雖然相似细移,也還是有區(qū)別的。最主要的是模式的目的不一樣熊锭,策略模式的目的是封裝一系列的算法弧轧,使得這些算法可以相互替換雪侥;而橋接模式的目的是分離抽象和實(shí)現(xiàn)部分,使得它們可以獨(dú)立的變化精绎。

23.2 橋接模式和狀態(tài)模式

由于從模式結(jié)構(gòu)上看速缨,狀態(tài)模式和策略模式是一樣的,這兩個(gè)模式的關(guān)系也基本上類似于橋接模式和策略模式的關(guān)系代乃。

只不過(guò)狀態(tài)模式的目的是封裝狀態(tài)對(duì)應(yīng)的行為旬牲,并在內(nèi)部狀態(tài)改變的時(shí)候改變對(duì)象的行為。

23.3 橋接模式和抽象工廠模式

這兩個(gè)模式可以組合使用搁吓。

橋接模式中原茅,抽象部分需要獲取相應(yīng)的實(shí)現(xiàn)部分的接口對(duì)象,那么誰(shuí)來(lái)創(chuàng)建實(shí)現(xiàn)部分的具體實(shí)現(xiàn)對(duì)象呢堕仔?這就是抽象工廠模式派上用場(chǎng)的地方擂橘。也就是使用抽象工廠模式來(lái)創(chuàng)建和配置一個(gè)特定的具體實(shí)現(xiàn)的對(duì)象。

事實(shí)上贮预,抽象工廠主要是用來(lái)創(chuàng)建一系列對(duì)象的贝室,如果創(chuàng)建的對(duì)象很少,或者是很簡(jiǎn)單仿吞,還可以采用簡(jiǎn)單工廠滑频,可以達(dá)到一樣的效果,但是會(huì)比抽象工廠來(lái)得簡(jiǎn)單唤冈。

23.4 橋接模式和模板方法模式

這兩個(gè)模式有相似之處峡迷。

雖然標(biāo)準(zhǔn)的模板方法模式是采用繼承來(lái)實(shí)現(xiàn)的,但是模板方法也可以通過(guò)回調(diào)接口的方式來(lái)實(shí)現(xiàn)你虹,如果把接口的實(shí)現(xiàn)獨(dú)立出去绘搞,那就類似于模板方法通過(guò)接口去調(diào)用具體的實(shí)現(xiàn)方法了。這樣的結(jié)構(gòu)就和簡(jiǎn)化的橋接模式類似了傅物。

可以使用橋接模式來(lái)模擬實(shí)現(xiàn)模板方法模式的功能夯辖。如果在實(shí)現(xiàn)Abstraction對(duì)象的時(shí)候,在里面定義方法董饰,方法里面就是某個(gè)固定的算法骨架蒿褂,也就是說(shuō)這個(gè)方法就相當(dāng)于模板方法。在模板方法模式里卒暂,是把不能確定實(shí)現(xiàn)的步驟延遲到子類去實(shí)現(xiàn)啄栓;現(xiàn)在在橋接模式里面,把不能確定實(shí)現(xiàn)的步驟委托給具體實(shí)現(xiàn)部分去完成也祠,通過(guò)回調(diào)實(shí)現(xiàn)部分的接口昙楚,來(lái)完成算法骨架中的某些步驟。這樣一來(lái)诈嘿,就可以實(shí)現(xiàn)使用橋接模式來(lái)模擬實(shí)現(xiàn)模板方法模式的功能了堪旧。

使用橋接模式來(lái)模擬實(shí)現(xiàn)模板方法模式的功能削葱,還有個(gè)潛在的好處,就是模板方法也可以很方便的擴(kuò)展和變化了淳梦。在標(biāo)準(zhǔn)的模板方法里面佩耳,一個(gè)問(wèn)題就是當(dāng)模板發(fā)生變化的時(shí)候,所有的子類都要變化谭跨,非常不方便。而使用橋接模式來(lái)實(shí)現(xiàn)類似的功能李滴,就沒(méi)有這個(gè)問(wèn)題了螃宙。

另外,這里只是說(shuō)從實(shí)現(xiàn)具體的業(yè)務(wù)功能上所坯,橋接模式可以模擬實(shí)現(xiàn)出模板方法模式能實(shí)現(xiàn)的功能谆扎,并不是說(shuō)橋接模式和模板方法模式就變成一樣的,或者是橋接模式就可以替換掉模板方法模式了芹助。要注意它們本身的功能堂湖、目的、本質(zhì)思想都是不一樣的状土。

23.5 橋接模式和適配器模式

這兩個(gè)模式可以組合使用无蜂。

這兩個(gè)模式功能是完全不一樣的,適配器模式的功能主要是用來(lái)幫助無(wú)關(guān)的類協(xié)同工作蒙谓,重點(diǎn)在解決原本由于接口不兼容而不能一起工作的那些類斥季,使得它們可以一起工作。而橋接模式則重點(diǎn)在分離抽象和實(shí)現(xiàn)部分累驮。

所以在使用上酣倾,通常在系統(tǒng)設(shè)計(jì)完成過(guò)后,才會(huì)考慮使用適配器模式谤专;而橋接模式躁锡,是在系統(tǒng)開(kāi)始的時(shí)候就要考慮使用。

雖然功能上不一樣置侍,這兩個(gè)模式還是可以組合使用的映之,比如:已有實(shí)現(xiàn)部分的接口,但是有些不太適應(yīng)現(xiàn)在新的功能對(duì)接口的需要墅垮,完全拋棄吧惕医,有些功能還用得上,該怎么辦呢算色?那就使用適配器來(lái)進(jìn)行適配抬伺,使得舊的接口能夠適應(yīng)新的功能的需要。

24.訪問(wèn)者模式的相關(guān)模式

24.1 訪問(wèn)者模式和組合模式

這兩個(gè)模式可以組合使用灾梦。

如同前面示例的那樣峡钓,通過(guò)訪問(wèn)者模式給組合對(duì)象預(yù)留下擴(kuò)展功能的接口妓笙,使得給組合模式的對(duì)象結(jié)構(gòu)添加功能非常容易。

24.2 訪問(wèn)者模式和裝飾模式

這兩個(gè)模式從表面看功能有些相似能岩,都能夠?qū)崿F(xiàn)在不修改原對(duì)象結(jié)構(gòu)的情況下修改原對(duì)象的功能寞宫。但是裝飾模式更多的是實(shí)現(xiàn)對(duì)已有功能加強(qiáng)、或者修改拉鹃、或者完全全新實(shí)現(xiàn)辈赋;而訪問(wèn)者模式更多的是實(shí)現(xiàn)給對(duì)象結(jié)構(gòu)添加新的功能。

24.3 訪問(wèn)者模式和解釋器模式

這兩個(gè)模式可以組合使用膏燕。

解釋器模式在構(gòu)建抽象語(yǔ)法樹(shù)的時(shí)候钥屈,是使用組合模式來(lái)構(gòu)建的,也就是說(shuō)解釋器模式解釋并執(zhí)行的抽象語(yǔ)法樹(shù)是一個(gè)組合對(duì)象結(jié)構(gòu)坝辫,這個(gè)組合對(duì)象結(jié)構(gòu)是很少變動(dòng)的篷就,但是可能經(jīng)常需要為解釋器增加新的功能,實(shí)現(xiàn)對(duì)同一對(duì)象結(jié)構(gòu)的不同解釋和執(zhí)行的功能近忙,這正好是訪問(wèn)者模式的優(yōu)勢(shì)所在竭业,因此這在使用解釋器模式的時(shí)候通常會(huì)組合訪問(wèn)者模式來(lái)使用。

后續(xù)應(yīng)該做的事

不是結(jié)束而是新的開(kāi)始及舍。并不是說(shuō)你就不用再學(xué)習(xí)設(shè)計(jì)模式了未辆,恰恰相反,要想在設(shè)計(jì)上更進(jìn)一步的話击纬,困難才剛剛開(kāi)始鼎姐。從中級(jí)的水平向上發(fā)展,更多的是需要思考和領(lǐng)悟更振,其難度比從入門(mén)到中級(jí)要大得多炕桨。因此對(duì)你而言,學(xué)到這里并不是學(xué)習(xí)的結(jié)束肯腕,而是新的開(kāi)始献宫。

你該怎么做

  • 1)多看
    多搜尋一些應(yīng)用設(shè)計(jì)模式的實(shí)際項(xiàng)目、工程或是框架实撒,參考別人的成功應(yīng)用姊途,再結(jié)合自己的經(jīng)驗(yàn)來(lái)思考和使用。當(dāng)然項(xiàng)目不應(yīng)該太大知态,太大了很難完全看懂捷兰;也不能太小,太小了负敏,沒(méi)有太大實(shí)用價(jià)值贡茅,尤其是無(wú)法參考多個(gè)模式綜合應(yīng)用的情況,幫助就不大了。
  • 2)多練
    多尋找機(jī)會(huì)顶考,把這些設(shè)計(jì)模式在實(shí)際應(yīng)用中使用赁还,只有親自動(dòng)手去試驗(yàn)和使用,才能真正掌握和領(lǐng)會(huì)設(shè)計(jì)模式的精髓驹沿。
  • 3)多總結(jié):認(rèn)真分析每次對(duì)設(shè)計(jì)模式的使用是否得當(dāng)艘策,有什么經(jīng)驗(yàn)和教訓(xùn),是否有變形使用的情況渊季,在不斷總結(jié)中進(jìn)步朋蔫。
  • 4)反復(fù)參閱《研磨設(shè)計(jì)模式》一書(shū):理論聯(lián)系實(shí)際,通過(guò)實(shí)際應(yīng)用反過(guò)來(lái)加深對(duì)理論的理解却汉,以達(dá)到融會(huì)貫通這些設(shè)計(jì)模式的知識(shí)斑举。因此,你需要反復(fù)參閱《研磨設(shè)計(jì)模式》一書(shū)病涨,看看書(shū)上的知識(shí),然后實(shí)踐璧坟,然后再回頭看書(shū)上的知識(shí)既穆,你會(huì)有不一樣的體會(huì)和領(lǐng)悟。
  • 5)多思考:多從設(shè)計(jì)上去思考這些設(shè)計(jì)模式雀鹃,考慮它的設(shè)計(jì)意圖幻工、設(shè)計(jì)思想、解決問(wèn)題的方式黎茎、實(shí)現(xiàn)的原理囊颅、模式的本質(zhì)、以及如何變形使用等等傅瞻。只要你堅(jiān)持去按照上面說(shuō)的做踢代,假以時(shí)日,必有所成嗅骄。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胳挎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溺森,更是在濱河造成了極大的恐慌慕爬,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屏积,死亡現(xiàn)場(chǎng)離奇詭異医窿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)炊林,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)姥卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人铛铁,你說(shuō)我怎么就攤上這事隔显∪捶粒” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵括眠,是天一觀的道長(zhǎng)彪标。 經(jīng)常有香客問(wèn)我,道長(zhǎng)掷豺,這世上最難降的妖魔是什么捞烟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮当船,結(jié)果婚禮上题画,老公的妹妹穿的比我還像新娘。我一直安慰自己德频,他們只是感情好苍息,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著壹置,像睡著了一般竞思。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钞护,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天盖喷,我揣著相機(jī)與錄音,去河邊找鬼难咕。 笑死课梳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的余佃。 我是一名探鬼主播暮刃,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爆土!你這毒婦竟也來(lái)了沾歪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雾消,失蹤者是張志新(化名)和其女友劉穎灾搏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體立润,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狂窑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桑腮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泉哈。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丛晦,到底是詐尸還是另有隱情奕纫,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布烫沙,位于F島的核電站匹层,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锌蓄。R本人自食惡果不足惜升筏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘸爽。 院中可真熱鬧您访,春花似錦、人聲如沸剪决。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柑潦。三九已至识虚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妒茬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工蔚晨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乍钻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓铭腕,卻偏偏與公主長(zhǎng)得像银择,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子累舷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚浩考、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,741評(píng)論 0 14
  • 設(shè)計(jì)模式匯總 一被盈、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用析孽、多...
    MinoyJet閱讀 3,937評(píng)論 1 15
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)只怎,斷路器袜瞬,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 總監(jiān)找我問(wèn)說(shuō) 你是不是快要走了 我說(shuō)是的 問(wèn)什么原因 我答快要結(jié)婚了 說(shuō)出去這句話就覺(jué)得很不舒服 總感...
    恭雖豈止閱讀 245評(píng)論 0 0
  • 每個(gè)人都有夢(mèng)想成真的機(jī)會(huì)邓尤,關(guān)鍵是你能否把握來(lái)到身邊的機(jī)會(huì)!
    f15d57595d1c閱讀 335評(píng)論 0 0