装饰模式与代理模式的区别
http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html
?
??? 學習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());…} }
?
總結
以上是生活随笔為你收集整理的装饰模式与代理模式的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uml学习入门
- 下一篇: Facade与Mediator模式的区别