主要区别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
自己理解:代理模式的存在是纯粹的功能增强;而装饰者模式有自己的基本大类分类(如披萨,意大利面,焗饭等,装饰的只是调味料而已,如盐,沙拉酱,糖等,拿java.io举例,它有基本的io类如:stringbufferinputstream, fileinputstream等,而filterinputstream中就是一堆调味料,可自行无限组合添加,pushbackinputstream,bufferinputestream等),装饰着模式最大的目的在于极有很多小功能而且相互之间可以无限制组合,将它们全部订为装饰者,可以自由灵活随意组合使用,不用为每一种组合定义一个类去实现。@@装饰着模式为了功能组合增强,代理模式只是纯粹的增强@@
代理模式示例:
//代理模式
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();
…
}
}
而装饰者模式:(是不是和java.io.下的代码很相似)
//装饰器模式
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());
…
}
}