代理模式理解
为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
为什么需要代理?
因为一个良好的设计不应该轻易的修改。这正是开闭原则的体现:一个良好的设计应该对修改关闭,对扩展开放。而代理正是为了扩展类而存在的。他可以控制对现有类(需要被代理的类)服务的访问,通俗的解释就是可以拦截对于现有方法的调用并做些处理。
在软件设计中,使用代理模式的意图很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象;或者在远程调用中,需要使用代理类处理远程方法调用的技术细节(如:RMI);也可能是为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的。
静态代理模式中,为什么要强制代理主题与真实主题实现相同的接口?
代理模式针对相同的接口编程,
1)以达到透明地替换原来的对象。
2)保证了代理对象具有和被代理对象具有一样的契约。
3)针对接口编程,灵活性,好处是不言而喻的。
4)代理类代理目标对象,必须让客户端看代理类和目标对象是一样的。
代理模式应用的几种情况:
1)远程代理Remote Proxy
通过代理来表示另一个地址空间中的对象,使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
2)虚代理Virtual Proxy
按需创建开销很大的对象。常用于延迟加载。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
copy-on-write代理:是虚拟代理的一种,把赋值操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
3)保护代理Protection Proxy
控制对原始对象的访问,在访问对象时可以附加一些操作。
4)智能指引Smart Reference
充当智能指针:能自动释放所引用的对象
总结
在客户端和目标对象之间增加了代理对象,中间加一层,解耦。代理类和目标对象实现同一接口,对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。