代理模式

数字精灵说
• 阅读 917
资料来源:<<大话设计模式>>

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: 代理模式其实就是在访问对象时引入一定程度的间接性,因为这个间接性,可以附加多种用途.

点赞
收藏
评论区
推荐文章
搞懂设计模式——代理模式 + 原理分析
举个栗子,众所周知,我们是可以在京东上购买机票的。但机票是航司提供的,我们本质上是代理销售而已。那为什么航司要让我们代理销售呢?我们又是如帮他做代理的呢?别急,本文将展开说说他们之间的关系。。。
Wesley13 Wesley13
4年前
java技术学习路线(自用)
一:常见模式与工具    1.常用设计模式:                 1.1.Proxy代理模式:指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。详见https://www.cnblogs.com/qifengshi/p/6566752.html       
Stella981 Stella981
4年前
ASMSupport教程4.7 生成关系运算符
<p在java中,关系运算符是很常用的,分别是&gt;,,&lt;,&gt;,&lt;,!这六种,我们按照惯例看看我们需要生成的代码:</p<divid"scid:9D7513F9C04C4721824A2B34F0212519:dfec0f1ca2ec4ebabc9b91c161fbfa47"class"wlWri
Wesley13 Wesley13
4年前
23种设计模式(1):单例模式
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。类型:创建类模式类图:!23种设计模式(1):单例模式第1张|快课网(http://static.oschina.net/uploads/img/201407/05200605_0dij.gif"23种设计模式(1):单例模式
Wesley13 Wesley13
4年前
Java描述设计模式(16):代理模式
本文源码:GitHub·点这里(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fcicadasmile%2Fmodelarithmeticparent)||GitEE·点这里(https://gitee.com/cicadasmile/modela
Wesley13 Wesley13
4年前
MongoDB 范围查询
查询价格在2009000  $gt 大于   $lt  小于//查询价格2009000范围的数据db.prodgory.find({"price":{$gt:"200",$lt:"9000"}})查询给定范围数据  $in//给定范围查询db.product1.find({"categor
Wesley13 Wesley13
4年前
Java描述设计模式(06):建造者模式
一、生活场景基于建造者模式,描述软件开发的流程。1、代码实现/基于建造者模式描述软件开发/publicclassC01_InScene{publicstaticvoidmain(Stringargs){B
Wesley13 Wesley13
4年前
JavaWeb之动态代理解决request请求编码问题
动态代理解决编码问题1.设计模式出现原因:软件开发过程中,遇到相似问题,将问题的解决方法抽取模型(套路)常见设计模式:单例,工厂,适配器,装饰者,动态代理。2.装饰者模式简单介绍谷歌汽车开发场景1.Java定义了汽车开发约定interfaceICar{s
Wesley13 Wesley13
4年前
Java设计模式_(结构型)_代理模式
引用百科即ProxyPattern,23种常用的面向对象软件的设计模式之一。代理模式的定义:为其他对象提供一种代理(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E4%25BB%25A3%25E7%2590%25
小万哥 小万哥
1年前
资源描述框架的用途及实际应用解析
RDF(资源描述框架)是一种用于机器理解网络资源的框架,使用XML编写。它通过URI标识资源,用属性描述资源,便于计算机应用程序处理信息。RDF在语义网上促进信息的确切含义和自动处理,使得网络信息可被整合。RDF语句由资源、属性和属性值组成。RDF文档包括&lt;rdf:RDF&gt;根元素和&lt;rdf:Description&gt;元素,后者用about属性标识资源。RDF还支持容器(如&lt;Bag&gt;、&lt;Seq&gt;和&lt;Alt&gt;)来描述集合。RDFS是RDF的扩展,提供描述类和属性的框架,而达布林核心是一组预定义属性,用于描述文档。
待兔 待兔
1年前
Java设计模式之 - 代理模式
代理模式的介绍:代理模式也称为委托模式,在开发中经常用到,是编程的好帮手,在日常生活中也比较常见。比如公司中午让同事帮忙带一份饭,比如我们请一个律师打官司,比如我们用代理服务器上网等等。代理模式真是无处不在。代理模式的定义:为其它对象提供一种代理以控制对这