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


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

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

                    

                     

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

        然而,實際上,在裝飾器模式和代理模式之間還是有很多差別的。裝飾模式主要是強調對類中代碼的拓展,而代理模式則偏向於委托類的訪問限制。換句話 說,用代理模式,代理類(proxy class)可以對它的客戶隱藏一個對象的具體信息。因此,當使用代理模式的時候,我們常常在一個代理類中創建一個對象的實例。並且,當我們使用裝飾器模 式的時候,我們通常的做法是將原始對象作為一個參數傳給裝飾者的構造器。

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

代理模式:

//代理模式
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());
            …
        }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM