背景
某些情况下,客户不想或不可以直接引用一个对象,只能通过一个称之为“代理”的第三方来间接引用。它起到一个中介的作用,通过代理对象,能够去掉客户不想看到的内容,或者添加客户需要的内容。
代码示例
|
|
上面是一个简单的代理模式,RealObject
是被代理的类,而Proxy
是代理类,代理类持有一个被代理类的对象,并且有一个相同名字的方法,当想调用被代理类方法时,通过代理调用,并且代理类可以增加一些功能。
优点
协调调用者和被调用者,降低系统耦合度
远程代理使得客户端访问远程机器上的对象
使用小对象代表大对象,减少系统资源消耗,对系统优化并提速
控制对真实对象的使用权限
不修改原始代码的情况下,对方法进行增强(如日志记录,验证权限,数据库连接和释放,Cache等
缺点
增加了中间层,会造成请求速度变慢
实现代理模式需要而外的工作,有些代理模式实现非常复杂
当方法数量增多时,对应代理的方法也会增多,造成代码量增加(Java动态代理可解决)
使用环境
远程代理:不同地址空间的对象提供一个本地代理对象
虚拟代理:需要创建一个资源消耗较大的对象,先创建资源小的代理对象,真实的 对象只有需要的时候在被创建
保护代理:控制客户端的访问权限,提供不同级别的权限