Java中“装饰模式”和“代理模式”有啥区别
Java中“装饰模式”和“代理模式”有以下区别:1.生效对象不同;2.作用不同;3.目标不同;4.侧重点不同。生效对象不同是指,装饰器模式生效的对象还是原本的对象,而代理模式生效的是新的对象(代理对象)。
1.生效对象不同
“装饰模式”是在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责;而“代理模式”是为其他对象提供一种代理以控制对这个对象的访问。区别在于,装饰器模式生效的对象还是原本的对象,而代理模式生效的是新的对象(代理对象)。
2.作用不同
“装饰模式”是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;而“代理模式”是给一个对象提供一个代理对象,并用代理对象来控制对原有对象的引用。
3.目标不同
“装饰模式”的目标仍然可以自行对外提供服务,装饰器只起增强和辅助作用;而“代理模式”是全权代理,目标根本不对外,全部由代理类来完成。
4.侧重点不同
“装饰模式”强调的是增强、新增行为;而“代理模式”强调的是对代理的对象施加控制,但不对对象本身的功能进行增强。
5.调用方式不同
一般“装饰模式”是通过构造器层层嵌套的形式,而“代理模式”隐藏被代理对象的内部细节。
延伸阅读
Java中代理模式分为哪几种
Java中代理模式主要分为五种,即远程代理(remote proxy)、虚拟代理(virtual proxy)、保护代理(protection proxy)、缓存代理(cache proxy)和智能引用(smart reference)。
1.远程代理
远程代理适用于提供服务的对象处在远程的机器上,通过普通的函数调用无法使用服务,需要经过远程代理来完成。因为并不能直接访问本体对象,所有远程代理对象通常不会直接持有本体对象的引用,而是持有远端机器的地址,通过网络协议去访问本体对象。
2.虚拟代理
在程序设计中常常会有一些重量级的服务对象,如果一直持有该对象实例会非常消耗系统资源,这时可以通过虚拟代理来对该对象进行延迟初始化。
3.保护代理
保护代理用于控制对本体对象的访问,常用于需要给Client的访问加上权限验证的场景。
4.缓存代理
缓存代理主要在Client与本体对象之间加上一层缓存,用于加速本体对象的访问,常见于连接数据库的场景。
5.智能引用
智能引用为本体对象的访问提供了额外的动作,常见的实现为C++中的智能指针,为对象的访问提供了计数功能,当访问对象的计数为0时销毁该对象。

