代理模式和装饰者模式区别

  1. 静态代理需要手动实现被代理接口的所有方法,而动态代理通过反射可以自动代理接口的所有方法
  2. 静态代理在编译的时候就生成了代理类的class文件;动态代理在运行的时候动态生成代理类
  3. 代理模式有很多用途:比如在方法调用前后添加日志;AIDL中就生成了远程接口的代理类,代理类帮助我们实现Binder底层的跨进程通信机制,让客户端用起来跟本地调用一样;日志系统、事务、拦截器、权限控制等。
  4. 代理的优点:如果我们要为具体类增加功能的时候,我们只需要在代理类上调用具体类方法的前后进行处理就好了,避免了修改具体实现类,符合开闭原则
  5. 静态代理的缺点:代理类需要跟委托类实现相同的接口,会出现大量的代码重复;当接口增加方法的时候,也要在代理类中添加相应方法。
  6. 使用动态代理可以统一对委托类的所有方法在InvokeHandler的invoke中进行处理
  7. 代理模式符合面向切面编程(AOP)思想,它强调在切入点的前后做增强处理

(1)远程代理:Binder的代理模式就是使用此方式,为某个对象在不同内存地址空间提供局部代理,屏蔽了跨进程通信的具体细节,这样Client端不需要考虑Server的存在;

(2)保护代理:使用代理控制对原始对象的访问,常常用于对原始对象有不同访问权限的地方。

(3)智能引用:使用代理来访问某个对象,并在代理中对对象进行引用计数来维护对象的声明周期。

装饰者模式:Java里面的IO类。透明地动态地扩展类的功能,比如我们给FileInputStream添加一个缓存读取的功能,就可以这样做:

BufferedInputStream in = new BufferedInputStream(new FileInputStream("filename"));

区别:
1. 装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。
2. 有的代理模式的被代理对象可以在编译时确定下来,而装饰者的被装饰类是在运行时动态设定的:

//客户不知道代理委托了另一个对象
Subject subject = new Proxy();
//客户需要指定被装饰的对象
InputStream in = new BufferedInputStream(new FileInputStream("filename"));

静态代理和动态代理

  1. 静态代理需要手动实现被代理接口的所有方法,而动态代理通过反射可以自动代理接口的所有方法
  2. 静态代理在编译的时候就生成了代理类的class文件;动态代理在运行的时候动态生成代理类
  3. 代理模式有很多用途:比如在方法调用前后添加日志;AIDL中就生成了远程接口的代理类,代理类帮助我们实现Binder底层的跨进程通信机制,让客户端用起来跟本地调用一样;日志系统、事务、拦截器、权限控制等。
  4. 代理的优点:如果我们要为具体类增加功能的时候,我们只需要在代理类上调用具体类方法的前后进行处理就好了,避免了修改具体实现类,符合开闭原则
  5. 静态代理的缺点:代理类需要跟委托类实现相同的接口,会出现大量的代码重复;当接口增加方法的时候,也要在代理类中添加相应方法。
  6. 使用动态代理可以统一对委托类的所有方法在InvokeHandler的invoke中进行处理
  7. 代理模式符合面向切面编程(AOP)思想,它强调在切入点的前后做增强处理

(1)远程代理:Binder的代理模式就是使用此方式,为某个对象在不同内存地址空间提供局部代理,屏蔽了跨进程通信的具体细节,这样Client端不需要考虑Server的存在;

(2)保护代理:使用代理控制对原始对象的访问,常常用于对原始对象有不同访问权限的地方。

(3)智能引用:使用代理来访问某个对象,并在代理中对对象进行引用计数来维护对象的声明周期。

装饰者模式:Java里面的IO类。透明地动态地扩展类的功能,比如我们给FileInputStream添加一个缓存读取的功能,就可以这样做:

BufferedInputStream in = new BufferedInputStream(new FileInputStream("filename"));

区别:
(1)装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。

(2) 有的代理模式的被代理对象可以在编译时确定下来,而装饰者的被装饰类是在运行时动态设定的:

//客户不知道代理委托了另一个对象
Subject subject = new Proxy();
//客户需要指定被装饰的对象
BufferedInputStream in = new BufferedInputStream(new FileInputStream("filename"));

(3) 装饰者除了实现被装饰者的接口以外,可以添加额外的方法来增强功能,比如DataInputStream,提供了从InputStream中读取Java基本数据类型的方法:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/mingC0758/article/details/81714170