A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 党巾水 中级黑马   /  2012-7-27 10:45  /  2949 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘馨琪 于 2012-8-7 14:43 编辑

请问动态代理和装饰类有什么区别吗?
感觉都是给原来的功能进行扩展。不解中……什么时候用装饰类,什么时候用动态代理呢?
谢谢!

7 个回复

倒序浏览
用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
换句话说,区别在于使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
huhuang03 发表于 2012-7-27 10:48
用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候, ...

递归地被构造   

这6个字有点深奥~求详解,谢谢
回复 使用道具 举报
不是什么递归,就是一步一步的意思。。。
回复 使用道具 举报
动态代理是在不改变接口的前提下,控制对象的访问。只有代理对象认为合适时,才会将客户端的请求传递给真实对象。
装饰类是在不改变接口的前提下,动态扩展对象的功能。装饰模式可以在不使用创造更多子类的情况下,给对象功能扩展
回复 使用道具 举报
动态代理有两种代理方式:
1、代理类和被代理类实现相同接口
2、代理类继承被代理类
但主要用的也是第一种
两者的区别主要区分:
装饰器模式:能动态的新增或组合对象的行为。
代理模式:为其他对象提供一种代理以控制对这个对象的访问.
装饰模式是“新增行为”,而代理模式是“控制访问”。关键就是我们如何判断是“新增行为”还是“控制访问”。
回复 使用道具 举报
02.public class Proxy implements Subject{  
03.  
04.       private Subject subject;  
05.       public Proxy(){  
06.             //关系在编译时确定   
07.            subject = new RealSubject();  
08.       }  
09.       public void doAction(){  
10.             ….  
11.             subject.doAction();  
12.             ….  
13.       }  
14.}  

01.//代理的客户   
02.public class Client{  
03.        public static void main(String[] args){  
04.             //客户不知道代理委托了另一个对象   
05.             Subject subject = new Proxy();  
06.             …  
07.        }  
08.}  


01.//装饰器模式   
02.public class Decorator implements Component{  
03.        private Component component;  
04.        public Decorator(Component component){  
05.            this.component = component  
06.        }  
07.       public void operation(){  
08.            ….  
09.            component.operation();  
10.            ….  
11.       }  
12.}  

01.//装饰器的客户   
02.public class Client{  
03.        public static void main(String[] args){  
04.            //客户指定了装饰者需要装饰的是哪一个类   
05.            Component component = new Decorator(new ConcreteComponent());  
06.            …  
07.        }  
08.}
回复 使用道具 举报
谢谢啦!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马