C#设计模式之:代理模式

情景描述:

小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();

代理模式应用

  • 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象在于不同地址空间的事实。
  • 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
  • 安全代理:用来控制真实对象访问时的权限
  • 智能指引:是指当调用真实的对象时,代理处理另一些事

本质:就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途;代理就是真实对象的代表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值