第07章 为别人做嫁衣--代理模式
7.2 没有代理的代码
追求者类:
class Pursuit
{
SchoolGirl mm;
public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Concole.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;}
}
}
客户端调用代码如下:
static void Main(string[] args)
{
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.name = “李娇娇“
Pursuit zhuojiayi = new Pursuit(jiaojiao);
zhuojiayi.GiveDolls;
zhuojiayi.GiveFlowers();
zhuojiayi.GiveChocolate();
Console.Read();
}
7.3 只有代理的代码
class Proxy
{
SchoolGirl mm;
public Proxy(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Concole.WriteLine(mm.Name + “送你洋娃娃”);
}
public void GiveFlowers()
{
Console.WriteLine(mm.Name + “送你鲜花”);
}
public void GiveChocolate()
{
Console.WriteLine(mm.Name + “送你巧克力”);
}
}
客户端代码:
static void Main(string[] args)
{
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.name = “李娇娇“;
Proxy daily = new Proxy(jiaojiao);
daili.GiveDolls();
daili.GiveFlowers();
daili.giveChocolate();
Console.Read();
}
7.4 符合实际的代码
代理接口如下:
interface IGiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
追求者类如下:
class Pursuit:IGiveGift
{
SchoolGirl mm;
public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Concole.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();
}
}
客户端如下
static void Main(string[] args)
{
schoolGirl jiaojiao = new SchoolGirl();
jiaojiao.name = “李娇娇”;
Proxy daily = new Proxy(jiaojiao);//daily对象中又一个叫gg的追求者
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChcoolate();
Console.Read();
}
7.5 代理模式
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方可以使用Proxy。
abstract class 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();
}
}
客户端代码
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.Request();
Console.Read();
}
7.6 代理模式应用
那么代理模式都用在一个什么场合呢?
第一,远程代理,也就是为一个对象在不同的地址空间提供局部代理。这样可以隐藏一个对象存在于不同地址空间的事实。
第二是虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化。
第三种应用是安全代理,用来控制真实对象访问时的权限。
代理模式其实就在在访问对象时引入一定成的的间接性,因为这种间接性,可以附加多种用途。代理就是真实对象的代表。