zoukankan      html  css  js  c++  java
  • 大话设计模式-代理模式

    代理模式

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


    代理模式结构演示

    实体抽象类: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();

    测试结果:控制台

    小红,送你鲜花
    小红,送你洋娃娃
    小红,送你巧克力
  • 相关阅读:
    Python3之format
    xml文件整理
    某系统采集2018
    sublime+python3 中文环境
    python3文本读取与写入常用代码
    redis3.0集群使用发现的一些问题
    mysql字符集
    redis3.0集群搭建
    安装Maven、nexus
    一键安装mysql5.6
  • 原文地址:https://www.cnblogs.com/errornull/p/10023104.html
Copyright © 2011-2022 走看看