代理模式(Proxy)
为其他对象提供一种代理以控制对这个对象的访问。
炎炎夏日即将过去,这个夏天的西瓜,你吃爽了吗?如果要问夏天有什么可留恋的?那么肯定是那冰冰凉凉的冰西瓜!炎热的夏季里,抱着半个从冰箱里刚拿出来的冰镇西瓜,用勺子挖着吃,是很多人觉得最惬意的吃法。相信大家也都这么干过...
今天跟大家聊的不是怎么吃西瓜,而是在哪里买西瓜。相信大家都见过路边的小摊小贩拖着一卡车西瓜便宜甩卖的场景吧;大家一般也可以在超市里买西瓜,但是这些西瓜是从哪里来的呢?小贩种的?超市种的?当然不是,大家接着往下看就明白了...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Proxy { //西瓜接口 public interface IWatermelon { //生产西瓜的方法 void product(); //销售西瓜的方法 void sell(); } //西瓜生产工厂 public class WatermelonFactory :IWatermelon { public void product() { Console.WriteLine("农民伯伯在地里种出西瓜..."); } public void sell() { Console.WriteLine("农民伯伯销售西瓜..."); } } //西瓜代理商 public class WatermelonProxy :IWatermelon { //从农民伯伯手里收购西瓜 private IWatermelon watermelon; public WatermelonProxy (IWatermelon watermelon) { this.watermelon = watermelon; } public void product() { this.watermelon .product (); Console.WriteLine("代理商从农民伯伯手里收购西瓜..."); } public void sell() { Console.WriteLine("代理商从农民手里低价收购西瓜,然后以较高的价格销售,从中赚取一定的差价..."); } } class Program { static void Main(string[] args) { //创建西瓜生产工厂 IWatermelon watermelonFactory = new WatermelonFactory(); //获得代理对象实例 IWatermelon watermelonProxy = new WatermelonProxy(watermelonFactory ); //代理商生产西瓜(其实是农民伯伯种出西瓜) watermelonProxy.product(); //代理商销售西瓜(低价收购西瓜,然后以较高价格出售,赚取差额利润) watermelonProxy.sell(); } } }
类图
代理模式包含如下三个角色:
Subject(抽象角色):声明真实主题和代理主题的共同接口
RealSubject(真实角色):真正处理请求的目标对象,客户端可以通过代理角色间接调用真实主题角色中定义的操作。
Proxy(代理角色):代理对象角色内部含有真是对象的引用,从而代理对象可以将请求转为真实对象处理。 同时,代理对象在执行真实对象操作的前后还可以添加附加操作。
主要优点:
1.能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
2.客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。
主要缺点:
1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,
2.实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂。
使用场合:
1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代理。
2.虚拟代理(VirtualProxy)若一个对象的创建非常耗时,可通过代理对象去调用,在真实对象创建前,返回一个假的调用,等真实对象创建好了,这时返回给客户端的就是一个真实对象的响应方法调用。
3.保护代理(ProtectionProxy)控制对原始对象的访问。
4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。
相关模式:
装饰者:装饰者重点在与添加附加行为修饰被装饰者。
代理:代理的重点是代替本人作业,减少对实际对象的操作。