代理模式


Title:《设计模式-代理模式》

Author:Hugu

StartedDate:Oct. 11th. 2019.

FinishedDate:Oct. 12th. 2019.


定义理解

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

角色与职责

  • 抽象角色(Subject)

    代理角色和真实角色必须要继承实现的共同抽象接口

  • 代理角色(Proxy)

    维护一个相应的真实角色,并可以代替真实角色执行其具有的功能

  • 真实角色(Real Subject)

    不方便出面而由代理角色代替的实际对象

实现步骤

  1. 分析并创建抽象角色接口
  2. 真实角色实现抽象接口
  3. 代理角色需要指向雇佣其的真实对象,实现抽象接口并隐式调用真实对象的方法

代码示例

使用代理追女孩:

被追求者

	//被追求者
    class SchoolGirl
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

送礼物的接口

	//送礼物的接口
    interface GiveGift
    {
        void GiveDolls();
        void GiveFlowers();
        void 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 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 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();
        }
    }

  • 代理使用的方法实际是雇主实现的方法
  • 代理维护一个与雇主相关的对象
  • 雇主维护一个与追求者相关的对象

使用场景

1). 远程代理:也就是为对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2). 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真是对象。
3). 安全代理:用来控制真实对象访问时的权限。
4). 智能指引:是指当调用真实的对象时,代理处理另外一些事。

附录

参考资料

  • 《大话设计模式》
  • 《设计模式精解及面试攻略》

完整代码

using System;

namespace 代理模式
{
    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; }
        }
    }

}
posted @ 2019-11-21 14:39  静俭阁主  阅读(50)  评论(0编辑  收藏  举报