在写这篇代理模式之前,小编还特意的留意了以前写的C#中的委托。下面先来回
顾一下C#中的委托。
委托上场
逻辑代码
public static int AddOpen(int a,int b)
{
return a + b;
}
public static int SubOpen(int a,int b)
{
return a - b;
}
//定义一个方法,把一个函数作为一个参数
public static int PrintResult(GenericFun Action,int a,int b)
{
//调用相应函数的方法
int result = Action(a, b);
return result;
}
从上面我们看出两个方法都有相似的部分,比如说参数个数和类型相同。那么我们
根据这一点就可以把他们的方法委托给一个叫Action的函数,通过这个函数来实现调
用。
客户端代码
//委托的声明
public delegate int GenericFun(int a, int b);
static void Main(string[] args)
{
//代表调用相加的方法
Console.Write("最终相加结果是:" + PrintResult(AddOpen ,5,6));
//代表调用相减的方法
Console.Write("最终相减的结果是:" + PrintResult(SubOpen ,15, 5));
}
有了委托,当在使用的时候,就可以通过委托来调用。
小结
委托其实是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数
来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用IF-else,
同时使得程序具有更好的扩展性。
说了这么多,与今天要的代理有毛线关系吗?先看一下代理模式的基本框架
代理模式
基本框架
Subject类,定义了RealSubject和Proxy的共同接口,这样就可以在任何使用
RealSubject的地方都可以使用Proxy
RealSubject类:定义Proxy所代表的真实实体。
Proxy类:保存了一个引用使得代理可以访问实体,并提供一个与Subject的接口相
同的接口,这样就可以代替实体。
牛刀小试
看这么多大家可能比较眼花缭乱的,小编在此为大家奉献一个例子,在进一步的
消化。
(以下这个例子仿照设计模式中的例子,添加了一些个人的理解)
类图
这个例子就是日常生活中男主人公羞涩难开口,通过代理来送女主角鲜花的故事。
代码
static void Main(string[] args)
{
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.Name = "李娇娇";
Proxy daili = new Proxy(jiaojiao);
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
Console.Read();
}
}
//送礼物的接口,这就是真正实体的抽象方法。
interface GiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
//代理实现接口
class Proxy : GiveGift
{
//实例化真正实体
Pursuit gg
public Proxy(SchoolGirl mm)
{
gg = new Pursuit(mm);
}
//调用真正实体的方法
public void GiveDolls()
{
this.gg.GiveDolls();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
public void GiveChocolate()
{
gg.GiveChocolate();
}
}
class Pursuit : GiveGift
{
SchoolGirl mm;
public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Console.WriteLine(mm.Name + " 送你洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(mm.Name + " 送你鲜花");
}
public void GiveChocolate()
{
Console.WriteLine(mm.Name + " 送你巧克力");
}
}
class SchoolGirl
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
小结
代理模式就是为其他对象提供一种代理以控制对这个对象的访问。
代理模式的应用
远程代理
为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。
虚拟代理
根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
安全代理
用来控制真实对象访问时的权限。
智能指引
指当调用真实的对象时,代理处理另外一些事。
【以上内容,小编也很难理解,如果哪位大神经验丰富的话,可以跟小编指点迷津】
委托和代理都已经说完了,那么下面来分析下两者
委托和代理
委托是某种形式上的代理,但是对类似方法的一种代理。
代理模式是一种更高层次的抽象,针对的是一个类,把想要代理的方法抽象为一个
接口,然后让代理对象去通过这个接口来间接的调用,从而实现代理。