代理模式和裝飾器模式的區別

轉載:https://www.cnblogs.com/xiaolovewei/p/7751332.htmlhtml

首先,讓咱們先看一下下面的這兩個UML類圖,他們分別描述了裝飾器模式和代理模式的基本實現。設計模式

                    

                     

        這兩個圖可能使咱們產生困惑。這兩個設計模式看起來很像。對裝飾器模式來講,裝飾者(decorator)和被裝飾者(decoratee)都實現同一個 接口。對代理模式來講,代理類(proxy class)和真實處理的類(real class)都實現同一個接口。此外,不論咱們使用哪個模式,均可以很容易地在真實對象的方法前面或者後面加上自定義的方法。this

        然而,實際上,在裝飾器模式和代理模式之間仍是有不少差異的。裝飾模式主要是強調對類中代碼的拓展,而代理模式則偏向於委託類的訪問限制。換句話 說,用代理模式,代理類(proxy class)能夠對它的客戶隱藏一個對象的具體信息。所以,當使用代理模式的時候,咱們經常在一個代理類中建立一個對象的實例。而且,當咱們使用裝飾器模 式的時候,咱們一般的作法是將原始對象做爲一個參數傳給裝飾者的構造器。url

        咱們能夠用另一句話來總結這些差異:使用代理模式,代理和真實對象之間的的關係一般在編譯時就已經肯定了,而裝飾者可以在運行時遞歸地被構造。spa

代理模式:.net

//代理模式
public class Proxy implements Subject{ private Subject subject; public Proxy(){ //關係在編譯時肯定
            subject = new RealSubject(); } public void doAction(){ …. subject.doAction(); …. } } //代理的客戶
public class Client{ public static void main(String[] args){ //客戶不知道代理委託了另外一個對象
             Subject subject = new Proxy(); … } }

裝飾器模式:設計

//裝飾器模式
public class Decorator implements Component{ private Component component; public Decorator(Component component){ this.component = component } public void operation(){ …. component.operation(); …. } } //裝飾器的客戶
public class Client{ public static void main(String[] args){ //客戶指定了裝飾者須要裝飾的是哪個類
            Component component = new Decorator(new ConcreteComponent()); … } }
相關文章
相關標籤/搜索