代理模式
意图
为其他对象提供一种代理以控制对这个对象的访问。
使用场景
代理对象目标是控制它所代理的对象的初始化与访问。一个常见的应用场景是,在创建一些实例化开销较大的对象时,代理可以将创建过程推迟到真正需要该对象的时候。
结构
代理模式结构如下
Proxy
– 保存一个引用使得代理可以访问实体。若RealObject和Subject的接口相同,Proxy会引用Subject。
– 提供一个与Subject的接口相同的接口,这样代理就可以用来替代RealObject。
– 控制对RealSubject的存取,并可能负责创建和删除它。Subject
– 定义RealObject和Proxy的共用接口,这样就在任何使用RealObject的地方都可以使用Proxy。RealObject
– 定义Proxy所代表的实体。
协作
代理根据其种类,在适当的时候向RealObject转发请求。
优点
- 职责清晰地分离了
- 扩展性良好
- 动态代理可以在运行阶段指定代理的对象
代理模式实现(Implement)
案例
现在很多人都使用最新款的苹果手机Iphone7,有些人因为Iphone的高昂售价望而止步,为了节约钱,一部分人做起了代购港行美行Iphone的生意。在这个例子中,使用静态代理,港行Iphone7商店跟京东商城就是我们的RealObject,而代购就是Proxy。
代码实现
卖手机的接口
京东商城
香港百老汇
Iphone代购,可以看到,代理类是在需要HkBroadWayStore(RealObject)的时候才进行实例化
购买手机
总结
回顾一下之前的装饰模式,发现装饰模式的结构跟代理模式非常相似,但是他们却不一样。装饰模式的目的是为目的对象动态的增加新的功能,而代理模式的目的是为了对目的对象进行控制。装饰模式在Decorator类实例化时会将需要装饰的对象传入构造器,而代理模式则是动态的分配一个对象。代理模式的实际使用场景非常广泛,例如在AOP(面向切面编程)时就使用了代理模式。