• 代理模式



    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; }
            }
        }
    
    }
    
  • 相关阅读:
    【转载】比较c++中的值传递,引用传递,指针传递
    【转载】在ARX中通过COM在ACAD中添加菜单和工具条
    【转载】预编译头文件phc
    jsp 连 sql server
    今天上传点关于asp的好东东
    转: [软件人生]给一个刚毕业学生朋友的建议
    世界首富比尔盖茨花钱全过程
    wap开发工具
    一名25岁的董事长给大学生的18条忠告
    今天再来点好东东,
  • 原文地址:https://www.cnblogs.com/z1r0s/p/14284143.html
Copyright © 2020-2023  润新知