代理模式(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)取代了简单的指针,它在访问对象时执行一些附加操作。
相关模式:
装饰者:装饰者重点在与添加附加行为修饰被装饰者。
代理:代理的重点是代替本人作业,减少对实际对象的操作。