当前位置: 首页 > news >正文

代理模式

资料来源:<<大话设计模式>>

1. 没有代理的代码

图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. 只有代理的代码

图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. 符合实际的代码

图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. 代理模式

为其他对象提供一种代理以控制对这个对象的访问.

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

相关文章:

  • 《动手搭建智能家居系统》——1.3 让世界更好(一点)
  • 杂项-模板
  • 《BeagleBone开发指南》——1.7 小结
  • 上帝之眼APP——实时定位监控、即时通讯
  • 《精解Windows8》——第1章 超越传统 1.1革命性的Windows操作系统
  • 安装dashboard在控制节点
  • text-align:justify 失效问题。
  • sqlite多表关联update
  • 阿里云虚拟化平台/块存储/弹性计算招聘技术人才啦!
  • 开发一个完整iOS直播app——GPUImage渲染底层实现-opengl
  • 移动VR还不够,两手都要抓的华硕要推出PC VR
  • TCP/IP具体解释--TCP首部的TimeStamp时间戳选项
  • fopen()、fwrite()、fread()函数使用说明与示例
  • 经历过高峰堵车绝望吗?亮出大招的滴滴也许能帮你走街串巷
  • 关于量子计算机的一些整理 (精心整理原创) (1)
  • [case10]使用RSQL实现端到端的动态查询
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【EOS】Cleos基础
  • HTTP中的ETag在移动客户端的应用
  • Java教程_软件开发基础
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • V4L2视频输入框架概述
  • vue:响应原理
  • 力扣(LeetCode)22
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 说说动画卡顿的解决方案
  • Spring Batch JSON 支持
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #前后端分离# 头条发布系统
  • $$$$GB2312-80区位编码表$$$$
  • (0)Nginx 功能特性
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (70min)字节暑假实习二面(已挂)
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (三)elasticsearch 源码之启动流程分析
  • (译) 函数式 JS #1:简介
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET : 在VS2008中计算代码度量值
  • .net core Swagger 过滤部分Api
  • .NET Framework杂记
  • .NET4.0并行计算技术基础(1)
  • .net流程开发平台的一些难点(1)
  • .NET是什么
  • ??javascript里的变量问题
  • @javax.ws.rs Webservice注解
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [autojs]逍遥模拟器和vscode对接
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BT]BUUCTF刷题第9天(3.27)
  • [hive]中的字段的数据类型有哪些
  • [java/jdbc]插入数据时获取自增长主键的值
  • [Linux]进程信号(信号入门 | 信号产生的方式 | 信号捕捉初识)