代理模式

摘自《大话设计模式》(程杰 著)
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。

image

应用

  1. 远程代理

为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

  1. 虚拟代理

根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能最优化。
比如打开很大的HTML网页,可以用虚拟代理来代替真实图片,此时代理存储了真实的图片路径和尺寸。

  1. 安全代理

用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。

  1. 智能指引

当调用真实的对象时,代理处理另外一些事情。
如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放。
或当第一次引用或持久对象时,将它装入内存。
或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。

代码

Subject.cs

abstract class Subject
{
    public abstract void Request();
}

RealSubject.cs

class RealSubject: Subject
{
    public override void Request()
    {
        Console.WriteLine("真实的请求");
    }
}

Proxy.cs

class Proxy : Subject
{
    RealSubject realSubject;
    public override void Request()
    {
        if (realSubject == null)
        {
            realSubject = new RealSubject();
        }
        realSubject.Request();
    }
}

Program.cs 客户端

Proxy proxy = new Proxy();
proxy.Request();

Console.Read();

实例

image

代理接口 GiveGift.cs

interface GiveGift
{
    void GiveDolls();
    void GiveFlowers();
    void GiveChocolate();
}

追求者类 Pursuit.cs

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 + "送你巧克力");
    }
}

代理类 Proxy.cs

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

客户端 Program.cs

SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.Name = "李娇娇";

Proxy daili = new Proxy(jiaojiao);

daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();

Console.Read();
posted @ 2025-12-12 09:34  苦涩如影相随固  阅读(4)  评论(0)    收藏  举报