代理模式

来源:互联网 发布:种草网络语的英文 编辑:程序博客网 时间:2024/05/21 19:40

 

    在写这篇代理模式之前,小编还特意的留意了以前写的C#中的委托。下面先来回

 

顾一下C#中的委托。

 

 

  委托上场

 

        逻辑代码

public static int AddOpen(int a,int b)        {            return a + b;        }        public static int SubOpen(int a,int b)        {            return a - b;        }        //定义一个方法,把一个函数作为一个参数        public static int PrintResult(GenericFun Action,int a,int b)        {            //调用相应函数的方法            int result = Action(a, b);            return result;        }

    从上面我们看出两个方法都有相似的部分,比如说参数个数和类型相同。那么我们

 

根据这一点就可以把他们的方法委托给一个叫Action的函数,通过这个函数来实现调

 

用。

 

   客户端代码

 //委托的声明        public delegate int GenericFun(int a, int b);        static void Main(string[] args)        {            //代表调用相加的方法            Console.Write("最终相加结果是:" + PrintResult(AddOpen ,5,6));                       //代表调用相减的方法            Console.Write("最终相减的结果是:" + PrintResult(SubOpen ,15, 5));        }


 

    有了委托,当在使用的时候,就可以通过委托来调用。

 

 

    小结

    委托其实是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数

 

来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用IF-else,

 

同时使得程序具有更好的扩展性。

 

  

    说了这么多,与今天要的代理有毛线关系吗?先看一下代理模式的基本框架

   

 

    代理模式

    基本框架

  

 

    Subject类,定义了RealSubject和Proxy的共同接口,这样就可以在任何使用

    RealSubject的地方都可以使用Proxy
  

    RealSubject类:定义Proxy所代表的真实实体。
  

    Proxy类:保存了一个引用使得代理可以访问实体,并提供一个与Subject的接口相

 

同的接口,这样就可以代替实体。

 

  

 

    牛刀小试

      看这么多大家可能比较眼花缭乱的,小编在此为大家奉献一个例子,在进一步的

消化。

      (以下这个例子仿照设计模式中的例子,添加了一些个人的理解)

      

     类图

  

 

 

    这个例子就是日常生活中男主人公羞涩难开口,通过代理来送女主角鲜花的故事。

 

    代码

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()        {            this.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; }        }


 

 

    小结

 

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

   

   代理模式的应用

   远程代理

         

     为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。

 

  虚拟代理

     

     根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。

 

  安全代理

     

     用来控制真实对象访问时的权限。

 

  智能指引

   

     指当调用真实的对象时,代理处理另外一些事。

 

 

以上内容,小编也很难理解,如果哪位大神经验丰富的话,可以跟小编指点迷津

 

 

    委托和代理都已经说完了,那么下面来分析下两者    

   

    委托和代理                 

 

    委托是某种形式上的代理,但是对类似方法的一种代理。

    

    代理模式是一种更高层次的抽象,针对的是一个类,把想要代理的方法抽象为一个

 

接口,然后让代理对象去通过这个接口来间接的调用,从而实现代理。

 

 

 


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注册公司居委会不盖章怎么办 营业执照名字和店名不一样怎么办 开炸鸡店没经验怎么办 提名候选人时重名重姓怎么办 别人用我的店名怎么办 wish店铺出现侵权产品怎么办 如果公司缺人该怎么办 鲁班奖证书丢了怎么办 个人注册服务号没有营业执照怎么办 社保过了缴费日怎么办 被评为d级纳税人怎么办 忘了税号tfn怎么办 个体户没有办税务登记怎么办 遇征地企业不搬怎么办 dnf账号改错名了怎么办 银行卡绑定的手机号码换了怎么办 支付宝手机号码换了怎么办 淘宝账号被注销了怎么办 注销淘宝号绑定的手机号怎么办 淘宝账号不小心注销了怎么办 淘宝旧密码忘了怎么办 淘宝登录原始密码忘记了怎么办 微信原始密码忘记了怎么办 优酷会员重复交费怎么办 微信解绑手机号密码忘了怎么办 闪银呼呼逾期5天怎么办 忘记淘宝账号和密码怎么办 蘑菇街账号忘了怎么办 台式电脑密码忘记了怎么办 单位社保登陆密码忘记了怎么办 12306的登录密码忘了怎么办 网银支付密码忘了怎么办 邮政网银密码忘了怎么办 12306新注册待核验怎么办 建行网银盾密码忘了怎么办 建行网银登陆密码忘了怎么办 建行网银密码忘了怎么办 建行手机网银密码忘了怎么办 移动宽带账号密码忘了怎么办 移动宽带忘记账号密码怎么办 宽带账号密码忘了怎么办