• 代理模式


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

         适用性:在需要用比较通用和复杂的对象指针代替简单的指针的时候, 使用 Proxy 模式。下面是一些可以使用 Proxy 模式常见情况:

       1)远程代理(Remote Proxy ) 为一个对象在不同的地址空间提供局部代表。 NEXTSTEP[Add94]使用 NXProxy 类实现了这一目的。 Coplien[Cop92] 称这种代理为“大使”(Ambassador) 。
       2)虚代理(Virtual Proxy )根据需要创建开销很大的对象。在动机一节描述的 ImageProxy就是这样一种代理的例子。
       3)保护代理(Protection Proxy )控制对原始对象的访问。 保护代理用于对象应该有不同 的访问权限的时候。 例如, 在 Choices 操作系统[CIRM93]中 KemelProxies 为操作系统对象提供了访问保护。
       4)智能指引(Smart Reference )取代了简单的指针,它在访问对象时执行一些附加操作。 它的典型用途包括:

       对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为SmartPointers[Ede92]。

        当第一次引用一个持久对象时,将它装入内存。在访问一个实际对象前,检查是否已经锁定了它, 以确保其他对象不能改变它。

    结构:

    示例代码:

    using System;

    // Subject类,定义了RealSubject和Proxy的公共接口
    // 这样在任何使用RealSubject的地方都可以使用Proxy

    abstract class Subject

    {

        public abstract void Request();

    }

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

        }

    }

    //客户代码

    class App

    {

        static void Main()

        {

            Proxy proxy new Proxy();

            proxy.Request();

            Console.Read();

        }

    }

    代码实现

    using System;

    //共同实现的接口

    interface GiveGift

    {

        void GiveDolls();

        void GiveFlowers();

        void GiveChocolate();

    }

    class SchoolGirl

    {

       public string name;   

    }

    //追求者类

    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 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 App

    {

        static void Main()

        {

            SchoolGirl jj = new SchoolGirl();

            jj.name = "娇娇";

            Proxy daili = new Proxy(jj);//代理跟女生打交道;

            daili.GiveDolls();

            daili.GiveFlowers();

            daili.GiveChocolate();

            Console.Read();

        }

    }

  • 相关阅读:
    Js实现继承的几种方式
    ES6-promise实现异步请求
    CSS重排和重绘
    jq在元素的后面插入内容
    yii2 Query Builder 查询打印sql语句
    js replace(a,b)替换指定字符
    linux 打印当前工作目录
    linux 查看磁盘空间
    linux查看大文件
    js-Cannot read property 'innerHTML' of null
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/2802261.html
Copyright © 2020-2023  润新知