情景描述:
小A通过小B追求小C
其中小B是代理
无代理小B时,小A亲自送东西给小C
代码
class A
{
C c;
public A(C c)
{
this.c = c;
}
public void GiveDolls()
{
Console.WriteLine(c.Name + ",送你洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(c.Name + ",送你鲜花");
}
public void GiveChocolate()
{
Console.WriteLine(c.Name + ",送你巧克力");
}
}
class C
{
private string name;
public string Name { get => name; set => name = value; }
public C(string name)
{
this.name = name;
}
}
// test 用户知道了小A在追求小C,小A想如果追求失败,会没脸见人了
C cc = new C("小C");
A aa = new A(cc);
aa.GiveDolls();
aa.GiveFlowers();
aa.GiveChocolate();
// result
小C,送你洋娃娃
小C,送你鲜花
小C,送你巧克力
有代理小B时,小A可以通过小B送东西给小C
代码
interface GiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
class C
{
private string name;
public string Name { get => name; set => name = value; }
public C(string name)
{
this.name = name;
}
}
class A : GiveGift
{
C c;
public A(C c)
{
this.c = c;
}
public void GiveDolls()
{
Console.WriteLine(c.Name + ",送你洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(c.Name + ",送你鲜花");
}
public void GiveChocolate()
{
Console.WriteLine(c.Name + ",送你巧克力");
}
}
class B : GiveGift
{
A a;
public B(C c)
{
a = new A(c);
}
public void GiveChocolate()
{
a.GiveChocolate();
}
public void GiveDolls()
{
a.GiveDolls();
}
public void GiveFlowers()
{
a.GiveFlowers();
}
}
//test 用户只看到了小C和小B(代理),根本不知道还有小A
C cc = new C("小C");
B bb = new B(cc);
bb.GiveDolls();
bb.GiveFlowers();
bb.GiveChocolate();
// result
小C,送你洋娃娃
小C,送你鲜花
小C,送你巧克力
代理模式
为其他对象提供一种代理以控制对这个对象的访问
代理模式模型
代码
abstract class Subject
{
public abstract void Request();
}
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}
class Proxy : Subject
{
RealSubject realSubject;
public override void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}
// test
Proxy proxy = new Proxy();
proxy.Request();
代理模式应用
- 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象在于不同地址空间的事实。
- 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
- 安全代理:用来控制真实对象访问时的权限
- 智能指引:是指当调用真实的对象时,代理处理另一些事
本质:就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途;代理就是真实对象的代表。