大话设计模式-代理模式

代理模式

代理模式为其他对象提供一种代理以控制对这个对象访问。

 


代理模式结构演示

实体抽象类: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 = new RealSubject();
        realSubject.Request();
    }
}

测试类:Program

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

测试结果:控制台

真实的请求

代理模式的应用

远程代理

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

虚拟代理

是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,这样就可以达到性能的最优化。

安全代理

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

智能指引

当调用真实的对象时,代理处理另外一些事,如计算真实对象的引用次数,当该对象没有引用时自动释放他。


更多例子:送礼物

代理接口:GiveGift

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

被追求者类:SchoolGirl

class SchoolGirl{
    public string Name { get; set; }
}

追求者类:Pursuit

class Pursuit : GiveGift{
    SchoolGirl mm;
    public Pursuit(SchoolGirl mm) => this.mm = mm;
    public void GiveChocolate() => Console.WriteLine(mm.Name + ",送你巧克力");
    public void GiveDolls() => Console.WriteLine(mm.Name + ",送你洋娃娃");
    public void GiveFlowers() => Console.WriteLine(mm.Name + ",送你鲜花");
}

代理类:Proxy

class Proxy : GiveGift{
    Pursuit gg;
    public Proxy(SchoolGirl mm) => gg = new Pursuit(mm);
    public void GiveChocolate() => gg.GiveChocolate();
    public void GiveDolls() => gg.GiveDolls();
    public void GiveFlowers() => gg.GiveFlowers();
}

测试类:Program

SchoolGirl sg = new SchoolGirl();
sg.Name = "小红";
Proxy proxy = new Proxy(sg);
proxy.GiveFlowers();
proxy.GiveDolls();
proxy.GiveChocolate();

测试结果:控制台

小红,送你鲜花
小红,送你洋娃娃
小红,送你巧克力
posted @ 2018-11-26 21:32  田错  阅读(152)  评论(0编辑  收藏  举报