設計模式:代理、裝飾和適配器模式的區(qū)別
結構對比
講實話,博主當初學習完整設計模式時,這三種設計模式單獨摘哪一種都是十分清晰和明確的,但是隨著模式種類的增加,在實際使用的時候竟然會出現(xiàn)恍惚,例如讀開源代碼時,遇到不以模式命名規(guī)范的代碼時,一時難以說清具體是使用的這三種里的哪一種。

之所以會出現(xiàn)混淆的原因是,三種模式的實現(xiàn)都是基于面向接口這一思想,三種模式都是針對某一個具體的接口實現(xiàn),并在其實現(xiàn)類上用一個對象對另一個對象提供間接訪問。
基于混淆點,從類圖上來看,適配器模式就可以最先被區(qū)別出來,適配器的類結構圖:

從類圖上來看,適配器的主角是Adapter這個類,這個類與目標接口是實現(xiàn)關系,但是Adaptee則不同,它可以是一個接口,也可以是一個具體的類,它是與Target平級的一個對象,與Target毫無關系,而Adapter與它的關系是對象組合,是Adaptee作為Adapter的一個內(nèi)部成員變量,Adapter的目的是將 Adaptee適配為Target。

?
相比于適配器模式,代理模式和裝飾模式反而更容易被混淆, 混淆的原因是二者都是基于一個公共接口,且主角類(Proxy和Decorator)又都是以組合對象的形式,對目標對象(RealSubject和ConcreteComponent)進行二次操作。實現(xiàn)上來看,兩者十分相似。
但是注意,這里還是有不同,
- 代理模式是代理對象(Proxy)對實際被代理對象(RealSubject)的間接訪問,是對公共接口的實現(xiàn)類提供間接訪問;
- 而裝飾模式的裝飾類是對被裝飾接口或者說被裝飾基類(Component)提供間接訪問,不是對接口(Component)的實現(xiàn)類提供間接訪問
也就是說,兩者提供間接訪問的對象不同,一個(代理模式)是基于具體的類,而另一個(裝飾模式)是基于抽象的接口 。這也是為什么只可以使用一次的request對象要基于裝飾模式提供封裝來達到二次使用的原因(詳細可翻閱
本質(zhì)對比
適配器模式的本質(zhì)
適配器模式的主要功能是進行轉(zhuǎn)換匹配,目的是復用已有的功能,而不是來實現(xiàn)新的接口。也就是說,客戶端需要的功能應該是已經(jīng)實現(xiàn)好了的,不需要適配器模式來實現(xiàn),適配器模式主要負責把不兼容的接口轉(zhuǎn)換成客戶端期望的樣子就可以了。

適配器的本質(zhì)是轉(zhuǎn)換功能,以提高復用性。不同于代理和裝飾,適配器中的目標對象可能與需要適配的對象毫無關系,適配過程中代碼甚至是全量的重寫,它的目標是將兩個內(nèi)容沿其中某個為主進行融合。

代理模式的本質(zhì)
代理模式是通過創(chuàng)建一個代理對象,用這個代理對象去代表真實的對象,客戶端得到這個代理對象后,對客戶端并沒有什么影響,就跟得到了真實對象一樣來使用。當客戶端操作這個代理對象的時候,實際上功能最終還是會由真實的對象來完成,只不過是通過代理操作的,也就是客戶端操作代理,代理操作真正的對象。
正是因為有代理對象夾在客戶端和被代理的真實對象中間,相當于一個中轉(zhuǎn),那么在中轉(zhuǎn)的時候就有很多花招可以玩,比如,判斷一下權限,如果沒有足夠的權限那就不進行中轉(zhuǎn)了,或者中轉(zhuǎn)到別的操作中。
代理模式的運行邏輯:

代理模式的本質(zhì)是控制對象訪問。核心在于Proxy角色, 類似于中間商,是目標對象的一個“前沿發(fā)言人”,你想要訪問目標對象,或者購買目標廠家的商品,必須從我代理商這里走, 我甚至可以不創(chuàng)建被代理對象,自己冒充被代理對象(直接以貼牌產(chǎn)品當作目標產(chǎn)品賣你)。

裝飾模式的本質(zhì)
裝飾模式能夠?qū)崿F(xiàn)動態(tài)地為對象添加功能,是從一個對象外部來給對象增加功能,相當于是改變了對象的外觀。當裝飾過后,從外部使用系統(tǒng)的角度看,就不再是使用原始的那個對象了,而是使用被一系列的裝飾器裝飾過后的對象。這樣就能夠靈活地改變一個對象的功能,只要動態(tài)組合的裝飾器發(fā)生了改變,那么最終所得到的對象的功能也就發(fā)生了改變。從這一點上來講,代理模式也可以滿足,但是不同的是,裝飾模式這里有一個代理無法越過的原則,那就是代理模式必須有目標對象,否則裝飾就無從談起。
裝飾模式的本質(zhì)是通過組合來加強目標對象的能力,是對象能力的延申。裝飾模式是在原有對象的基礎上進行外層包裝,可以對目標對象的每一個方法都進行前置、后置的補充和加強,但是本質(zhì)上并沒有改變原對象,是一種擴展思維,這一點可以參考AOP的思想。

?

適配器模式、代理模式、裝飾模式
浙公網(wǎng)安備 33010602011771號