• 设计模式------代理模式


    代理模式为其它对象提供一种代理,以控制对这个对象的訪问。所谓代理,就是真实对象的代表。

    在某些情况下,一个对象不适合或者不能直接引用还有一个对象,而代理对象能够在client和目标对象之间起到中介的作用。

    举个样例。网易是暴雪在中国大陆的代理,暴雪为什么不在中国直接运营,却要通过网易作为代理呢?这是由于暴雪公司在美国。假设让游戏玩家通过网络连接到美国的游戏server,那将是一种恐怖到令人无法想象的情形。

    1.角色:

    抽象主题角色(Subject)

    代理主题角色(Proxy) 

    真实主题角色(RealSubject)


    结构图:


    真正对象与代理对象实现同一个接口,先訪问代理类再訪问真正要訪问的对象。

    2.优缺点 

    长处:

    代理对象在client和目标对象之间起到中介的作用,保护了目标对象;能够协调调用者与被调用者,在一定程度上降低了系统的耦合度.。增强了扩展性,使角色职责清晰。

    缺点:

    由于添加了代理。会造成请求的处理速度变慢,并且有些代理模式的实现比較复杂。

    3.应用:

    (1)远程代理:

    为一个对象在不同的地址空间提供局部代表,能够隐藏一个对象存在不同地址空间的事实。

    (2)虚拟代理:

    依据须要创建开销非常大的对象,通过它来存放实例化须要非常长时间的真实对象。使得此对象仅仅在须要时才会被真正创建  。

    (3)安全代理:
    用来控制真实对象訪问时的权限。能够给不同的用户提供不同级别的使用权限。

    (4)智能指引:

    当调用真实的对象时,提供一些额外的操作。比方将对此对象调用的次数记录下来等。

    4.代码示范:

    需求:追求者通过代理给心仪的女孩送礼物。

    结构图:


    代理接口:

     interface GiveGift  //送礼物接口
        {
            void GiveDolls();
            void GiveFlowers();
            void GiveChocolate();
        }

    被追求者类:

     class SchoolGirl
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }

    追求者类:

     class Pursuit : GiveGift  //追求者实现“送礼物”接口
        {
            SchoolGirl mm;
            public Pursuit(SchoolGirl mm)
            {
                this.mm = mm;
            }
            public void GiveDolls()
            {
                Console.WriteLine(mm.Name + " 送你洋娃娃");
            }
    
            ......
        }
    代理类:
    class Proxy : GiveGift  //代理类实现“送礼物”接口
        {
            Pursuit gg;
            public Proxy(SchoolGirl mm)
            {
                gg = new Pursuit(mm);
            }
    
    
            public void GiveDolls()
            {
                gg.GiveDolls();  //在实现方法中调用追求者类的相关方法
            }
    
           ......
        }

    client:

     static void Main(string[] args)
            {
                SchoolGirl jiaojiao = new SchoolGirl();
                jiaojiao.Name = "李娇娇";
    
                Proxy daili = new Proxy(jiaojiao);
    
                daili.GiveDolls();
                daili.GiveFlowers();
                daili.GiveChocolate();
    
                Console.Read();
            }
    效果图:



    代理模式的本质就是迂回战术。通过加入一个中间层来解决这个问题。它是软件系统中非经常见的一个模式。代理一般实现的功能都是连接到server并进行数据下载和数据翻译以及本土化处理等操作,之后代理再将这些数据传送给本地的客户去使用。代理模式的应用使得client的压力大大降低,提升了客户的数目。


  • 相关阅读:
    Unity3D GUI图形用户界面系统
    Unity3D 自动寻路入门指南
    Unity3D 导航网格自动寻路(Navigation Mesh)
    拓展通用的冒泡排序方法
    DoTween 应用设置
    DoTween 教程
    Unity3D 脚本手册
    unity3d中获得物体的size
    Unity自动寻路Navmesh之高级
    C# 代码页获取input的值
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10943212.html
  • Copyright © 2020-2023  润新知