资料来源:<<大话设计模式>>
1. 没有代理的代码
class Program
{
static void Main(string[] args)
{
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.Name = "李娇娇";
Pursuit zhuojiayi = new Pursuit(jiaojiao); //不认识,有问题
zhuojiayi.GiveDolls();
zhuojiayi.GiveFlowers();
zhuojiayi.GiveChocolate();
Console.Read();
}
}
//追求者
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; }
}
}
A: 这样写不就是等于他们直接互相认识,并且是卓本人亲自送东西给娇娇了吗?
2. 只有代理的代码
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();
}
}
//代理人
class Proxy
{
SchoolGirl mm;
public Proxy(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 + " 送你巧克力");
}
}
A: 使得礼物是代理送的,而你刚才还肯定的说,卓这个人存在,你怎么能正确呢?
B: 事实上,应该是追求者通过代理送给被追求者礼物,这才是合理的,怎么办?
A: 不妨仔细观察下Pursuit和Proxy有没有相似的地方?
B: 他们都有送礼物的方法.哦,他们都实现了同样的接口?
3. 符合实际的代码
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; }
}
}
B: 娇娇不认识追求她的人,但是却可以通过代理人得到礼物.
4. 代理模式
为其他对象提供一种代理以控制对这个对象的访问.
class Program
{
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.Request();
Console.Read();
}
}
//定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSuject的地方都可以使用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();
}
}
5. 代理模式应用
B: 都用在哪些场合?
A: 1)远程代理,也就是为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在与不同地址空间的事实.__2)虚拟代理,是根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的真实对象.__3)安全代理,是用来控制真实对象访问时的权限.__4)智能代理,是指调用真实的对象时,代理处理另外一些事.如计算真实对象的引用次数.
A: 代理模式其实就是在访问对象时引入一定程度的间接性,因为这个间接性,可以附加多种用途.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。