zoukankan      html  css  js  c++  java
  • 搞定设计模式2之代理模式

    今天来看看代理模式。首先要理解何为代理模式?啥时候用到代理模式?

    当人A要做一件事情,但苦于无法和这个事情的当事人B认识,而使事情特别难办。同时B的一个朋友C也是自己的朋友,这样我们可以委托C去请求B帮忙而达到目的,好处是A不用去认识BC就是AB的代理人,起着中间人的作用。

    把这个例子放到我们的软件设计中来,A可以放在客户端,起着事件的引导作用。然后C作为A的代理人,牢记A的委托(传递A的实例等)B接触,然后通过自己自身和B的关系(在C中存有B的实例)和B(事件的响应)接触,最后的部分和A完全没有关系。因此,B一旦发生变化只要C知道就可以了,A(这里代表客户端)完全可以不用理会这样可以减轻客户端的负担,使软件的维护成本下降。

    下面来举一个例子(例子来自《大话设计模式》)

    //送礼物

        interface GiveGift      //送礼物这个行为的接口

        {

            void GiveDolls();

            void GiveFlowers();

            void GiveChocolate();

        }

    送礼物给BA提出来的,但AB并不认识,只有C认识B。因此AC有共同的行为。按面向对象的原则,我们应该把这个行为提升为接口,供AC来实现。不过在C里面的这个行为的实现是对A的行为实现。

    B是一个实体,没有任何的行为。

    代码如下:

    class B           //接受礼物者类

        {

            private string name;

            public string Name

            {

                get { return name; }

                set { name = value; }

            }

        }

     

    A的代码如下:

    class A : GiveGift    //追求者类,实现GiveGift接口,但没有直接作用于被追求者

        {

            B b;      //送礼物的对象

            public A(B b)

            {

                this.b = b;

            }

            public void GiveDolls()        //这些具体的方法的调用将在代理类里面进行

            {

                Console.WriteLine(b.Name + " 送你洋娃娃");

            }

            public void GiveFlowers()    //这些具体的方法的调用将在代理类里面进行

            {

                Console.WriteLine(b.Name + " 送你鲜花");

            }

            public void GiveChocolate()   //这些具体的方法的调用将在代理类里面进行

            {

                Console.WriteLine(b.Name + " 送你巧克力");

            }

        }

     

    C作为代理人,代码如下:

    class C : GiveGift             //代理类,实现GiveGift接口

        {

            A gg;

            public C(B b)

            {

                gg = new A(b);     //在代理类的构造函数里面实例化追求者类的对象

            }

            public void GiveDolls()    //通过代理类的方法去调用追求者类的方法

            {

                gg.GiveDolls();

            }

            public void GiveFlowers()     //通过代理类的方法去调用追求者类的方法

            {

                gg.GiveFlowers();

            }

            public void GiveChocolate()     //通过代理类的方法去调用追求者类的方法

            {

                gg.GiveChocolate();

            }

        }

     

    如此客户端的代码就好办了:

    class Program

        {

            static void Main(string[] args)          //客户端调用

            {

                B b = new B();

                b.Name = "接收礼物的人";          //实例化一个被追求者类的对象

                C daili = new C(b);       //只有代理人C才认识B

                daili.GiveDolls();  //调用代理类的方法,方法里面实际执行的是追求者的方法

                daili.GiveFlowers();

                daili.GiveChocolate();

                Console.Read();

            }

        }

     

    这个模式其实不难理解,类之间的调用也很明确。多动脑筋,把共同点找出来作为一个接口是关键

    本例子下载地址:https://files.cnblogs.com/mengxin523/代理模式.rar

  • 相关阅读:
    面向对象之多态,property
    描述符
    day23 面向对象之继承
    day22面向对象
    os模块
    logging日志模块,四种方式
    Linux 如何测试 IO 性能(磁盘读写速度)
    Vi命令:如何删除全部内容
    cdnbest如何查看站点操作日志(同步日志)
    Linux查找含有某字符串的所有文件
  • 原文地址:https://www.cnblogs.com/saper/p/1393606.html
Copyright © 2011-2022 走看看