黑马程序员技术交流社区

标题: 装饰模式和动态代理的区别 [打印本页]

作者: 梦想蓝色天空    时间: 2013-7-24 17:49
标题: 装饰模式和动态代理的区别
本帖最后由 梦想蓝色天空 于 2013-7-25 09:59 编辑

我一直认为都是对方法的增强,但是不知道二者有什么区别,什么时候用代理,什么时候用装饰模式,请大家解惑,谢谢
作者: HM代景康    时间: 2013-7-24 18:04
装饰器模式:能动态的新增或组合对象的行为。
代理模式:为其他对象提供一种代理以控制对这个对象的访问.
装饰模式是“新增行为”,而代理模式是“控制访问”。

装饰模式是在原有基础之上增加额外的功能,而代理模式有两种情况可以使用第一种是延迟代理对象,对于大文件或者目前还未加载完的对象,使用比较合适。第二种为权限判断,在调用功能前判断当前用户是否有此权限。

代理模式不是嵌套调用的。

装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;
代理模式给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;
装饰模式应该为所装饰的对象增强功能;
代理模式对代理的对象施加控制,并不提供对象本身的增强功能
作者: yangchao313    时间: 2013-7-24 19:02
装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。        
作者: liuzhming    时间: 2013-7-24 19:32
代理模式的作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。静态代理模式中,真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但实际使用时,一个真实角色必须对应一个代理角色,如果大量使用,就会导致类的急剧膨胀,这就用到动态代理了。动态代理模式下,被代理的对象(真实角色)可以在运行时动态改变,需要控制的接口(代理与真实对象共有的接口)也可以在运行时改变。其实动态代理就是客户通过代理类来调用其他对象的方法。装饰模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。它主要是用来在不创造更多子类的情况下将对象的功能加以扩展。我们可以形象地理解成,动态代理是中介,起着连接客户与商家的作用。装饰对象的类是一个对象的类的子类,不仅拥有父类的功能,还有自己特有的功能。

作者: 深圳在漂移    时间: 2013-7-24 19:58
装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,常常在一个代理类中创建一个对象的实例。并且,当使用装饰器模 式的时候,通常的做法是将原始对象作为一个参数传给装饰者的构造器。

作者: 王海旺    时间: 2013-7-24 21:14
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;
代理模式给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;
装饰模式应该为所装饰的对象增强功能;
代理模式对代理的对象施加控制,并不提供对象本身的增强功能
作者: 梦想蓝色天空    时间: 2013-7-25 09:58
明白了。。谢谢大家




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2