一、什么是代理模式
给对象一个代理位置,让代理能操作这对象
代理这个名字很能说明问题,我来代替你做一些事.
UML图
二、适用场景
所有那些不适于当面到场的对象,就需要找个对象.不管是远程的原因,虚拟的原因,还是安全原因,都可以使用代理.
在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
三、优缺点
优点
便于对象解除大面积的耦合问题,将功能拆解,客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。
缺点
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。
实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理。
四、大话中的例子
娇娇的恋爱史,就是一部代理上位史,买房买车打官司可以代理,谈恋爱可千万别.桌贾谊追求女孩子的所有业务,像送鲜花,送电影票,买早餐全都让戴利做了,娇娇只和戴利有交集,却不认识桌贾谊.
五、我的例子
using System;
namespace AgencyMode
{
class Program
{
static void Main(string[] args)
{
Naruto naruto = new Naruto();
naruto.FindCat(new Cat("小火柴"));
Console.ReadKey();
}
}
interface Subject
{
void FindCat(Cat maomi);
}
class Cat
{
string catName;
public string CatName { get { return catName; } set { catName = value; } }
public Cat(string catName)
{
this.catName = catName;
}
}
class Villager : Subject
{
public void FindCat(Cat maomi)
{
Console.WriteLine("找一只叫{0}的猫咪", maomi.CatName);
}
}
class Naruto : Subject
{
Villager villager;
public Naruto()
{
if (villager == null)
villager = new Villager();
}
public void FindCat(Cat maomi)
{
villager.FindCat(maomi);
}
}
}
运行结果
PS:代理在实际需求对象与业务方之间多加了一层中介,也就是代理,这无论如何都会增加类的复杂性.所以在有实际需要的时候使用才合适.