c#代理模式
1、定义
为其他对象提供一种代理以控制对这个对象的访问
2、原理
UML类图
Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy代码实现
//Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy
abstract class Subject
{
public abstract void Request();
}
//定义Proxy所代表的真实实体
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}
//保存一个引用,使得代理可以访问实体,并提供一个与Subject相同的接口,使得代理可以代替实体
class Proxy : Subject
{
RealSubject realsubject;
public override void Request()
{
if (realsubject==null)
{
realsubject = new RealSubject();
}
realsubject.Request();
}
}
客户端:
class Program
{
static void Main(string[] args)
{
Proxy px = new Proxy();
px.Request();
Console.ReadKey();
}
}
输出:“真实的请求”。
3、实例
以代理别人送礼物为例:
1. UML类图
2.代码实现
//定义送礼物的接口,让代理和追求着都实现
interface GiveGift
{
void SendFlower();
void SendDolls();
void SendChocolate();
}
//追求者
class Persuit : GiveGift
{
SchoolGirl schoolgirl;
public Persuit(SchoolGirl girl)
{
this.schoolgirl = girl;
}
public void SendChocolate()
{
Console.WriteLine(schoolgirl.Name+":送你巧克力");
}
public void SendDolls()
{
Console.WriteLine(schoolgirl.Name + ":送你娃娃");
}
public void SendFlower()
{
Console.WriteLine(schoolgirl.Name + ":送你花");
}
//代理,负责送礼物
class Proxy : GiveGift
{
Persuit persuit;
public Proxy(Persuit per)
{
this.persuit = per;
}
public void SendChocolate()
{
persuit.SendChocolate();
}
public void SendDolls()
{
persuit.SendDolls();
}
public void SendFlower()
{
persuit.SendFlower();
}
}
//女孩
class SchoolGirl
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
客户端:
class Program
{
static void Main(string[] args)
{
SchoolGirl girl = new SchoolGirl();
girl.Name = "LSP";
Persuit DZB = new Persuit(girl);//追求者认识女生
Proxy DZ = new Proxy(DZB);//代理认识追求者
DZ.SendChocolate();
DZ.SendDolls();
DZ.SendFlower();
Console.ReadKey();
}
}
输出:“LSP:送你巧克力,LSP:送你娃娃,LSP:送你花”
4、应用
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同的地址空间的事实
- 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
- 安全代理,用来控制真实对象访问的权限。一般用于对象应该有不同的访问权限的时候
- 智能指引,是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时可以自动释放它,或当第一次引用一个持久对象时,将他装入内存;或在访问一个实际对象前,检查是否一斤锁定它,以确保其他对象不能改变它。
他们都是通过代理在访问一个对象时附加一些内务处理