裝飾器模式關注於在一個對象上動態的添加方法,然而代理模式關注於控制對對象的訪問。換句話 說,用代理模式,代理類(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());
…
}
}