Title:《设计模式-代理模式》
Author:Hugu
StartedDate:Oct. 11th. 2019.
FinishedDate:Oct. 12th. 2019.
定义理解
代理模式为其他对象提供一种代理以控制对这个对象的访问。
角色与职责
-
抽象角色(Subject):
代理角色和真实角色必须要继承实现的共同抽象接口
-
代理角色(Proxy):
维护一个相应的真实角色,并可以代替真实角色执行其具有的功能
-
真实角色(Real Subject):
不方便出面而由代理角色代替的实际对象
实现步骤
- 分析并创建抽象角色接口
- 真实角色实现抽象接口
- 代理角色需要指向雇佣其的真实对象,实现抽象接口并隐式调用真实对象的方法
代码示例
使用代理追女孩:
被追求者:
//被追求者
class SchoolGirl
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
送礼物的接口:
//送礼物的接口
interface GiveGift
{
void GiveDolls();
void GiveFlowers();
void 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 Proxy : GiveGift
{
//声明一个雇主变量,用来存储聘用代理者的雇主对象
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 Program
{
static void Main(string[] args)
{
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.Name = "李娇娇";
Proxy daili = new Proxy(jiaojiao);
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
Console.Read();
}
}
注:
- 代理使用的方法实际是雇主实现的方法
- 代理维护一个与雇主相关的对象
- 雇主维护一个与追求者相关的对象
使用场景
1). 远程代理:也就是为对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2). 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真是对象。
3). 安全代理:用来控制真实对象访问时的权限。
4). 智能指引:是指当调用真实的对象时,代理处理另外一些事。
附录
参考资料
- 《大话设计模式》
- 《设计模式精解及面试攻略》
完整代码
using System;
namespace 代理模式
{
class Program
{
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()
{
//调用雇主对象自身的方法
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; }
}
}
}