Java 代理模式和裝飾者模式的區別

來源:互聯網
上載者:User

標籤:應該   程式   它的   span   教材   als   rate   action   代碼   

裝飾模式:以對用戶端透明的方式擴充項物件的功能,是繼承關係的一個替代方案;
代理模式:給一個對象提供一個代理對象,並有代理對象來控制對原有對象的引用;


裝飾模式應該為所裝飾的對象增強功能;代理模式對代理的對象施加控制,並不提供對象本身的增強功能

二者的實現機制確實是一樣的,可以看到他們的執行個體代碼重複是很多的。但就語義上說,這兩者的功能是相反的,模式的一個重要作用是簡化其他程式員對你程式的理解,

你在一個地方寫裝飾,大家就知道這是在增加功能,你寫代理,大家就知道是在限制,

雖然代碼很可能相同,但如果你都叫他們裝飾,別人會很迷惑的。

--------------------------------------------------------------

學習AOP時,教材上面都說使用的是動態代理,可是在印象中代理模式一直都是控制訪問什麼的,怎麼又動態增加行為了,動態增加行為不是裝飾器模式嗎?於是 找了很多資料,想弄清楚這兩者之間到底有什麼區別。結果發現這一篇英文文章講的很清晰,就翻譯一下,供參考。       

        首先,讓我們先看一下下面的這兩個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());

}
}
本文轉自http://www.cnblogs.com/onlywujun/archive/2013/03/28/2985887.html 感謝作者

Java 代理模式和裝飾者模式的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.