引例 : 追求者(C),被追求者(B) ,代理者(A)
故事概要: A和B是好朋友, A喜欢B ,但A以C的名义去送给B礼物
1.没有代理
追求者类
class Pursuit
{
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; }
}
}
注:被追求者根本就不认识C 怎么办?
2.有代理
这样的情况下 代码中只体现了代理,真正的追求者又不见了 ,变成了礼物是代理买的了
那么如何能写出,追求者是存在的,同时代理也是存在的, 实现 礼物是追求者买的, 代理去送礼物呢?
引入 : 代理模式
代理模式 : 为其他对象提供一种代理以控制这个对象的访问
代理模式结构图 :
代理模式应用模板:
//代理模式 格式
abstract classSubject //subject类 定义了 代理和真实实体的接口
{
public abstract void Request();
}
//RealSubject ,定义Proxy 所代表的真实实体
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}
//Proxy 类,保存一个引用使得代理可以访问实体,并提供一个与Subject 的接口相同的接口,这样就能代替实体
class Proxy : Subject
{
RealSubject realSubject;
public override void Request()
{
if (realSubject == null)
{
realSubject = newRealSubject();
}
realSubject.Request();
}
}
就开篇的故事来说 利用代理模式符合要求 如下所示
代理接口如下: interface IGiveGift { void GiveDolls(); void GiveFlowers(); void GiveChoolate(); } //追求者如下 class Pursuit :IGiveGift //追求者继承接口,进而实现送礼物的一系列动作 { 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 Proxy : IGiveGift { Pursuit gg; public Proxy(SchoolGirl mm) { gg = new Pursuit(mm); } public void GiveDolls() { gg.GiveDolls(); } public void GiveFlowers() { gg.GiveFlowers(); } public void GiveChocolate() { gg.GiveChocolate(); } } //被追求者 class SchoolGirl { //private string name; public string name { get { return name; } set { name = value; } } }
通过上述代码的描述 就能符合我们预想的要求了,即存在追求者 也存在 代理者 虽然被追求者不认识追求她的人,但是却通过代理得到了礼物,效果也达到了
附录:
代理模式使用的场合:
代理模式 应用场合 :
- 远程代理 也就是为了一个对象在不同的地址空间提供局域代表。这样可以隐藏一个对象存在于不同地址空间的事实
- 虚拟代理 是根据需要创建开销很大的对象, 通过它来存放实例化需要很长时间的真实对象
- 安全代理 用来控制真实对象访问时的权限
- 智能指引 是指当调用真实的对象时,代理处理另外一些事
个人理解 :
代理就是真实对象的代表,通过代理去办我们不能去办的事,我想这就像是生活中的老板和秘书吧,老板说 ,秘书去做, 不必老板全部出面去解决事情。 即方便 同时也提高了工作效率 ,就像设计模式中举得例子,图片 网页代理显示,但是我们需要的时候,还是要去真正的地方下载。在开发中应用代理模式会使职责更加清晰吧。就像我们常见的中介一样, 各取所需,目的都是一样的,通过代理来完成 扩展性也就更高了,如果我想找保姆,我自己的能力,范围有限,但是通过中介 我可以选择的人就多了,这就是利用代理模式的好处吧!
---------大话设计模式(代理模式)