• 【设计模式】代理模式


      相信一说起这个代理模式,大家都能想起《大话设计模式》书上那个形象的小例子吧,戴笠替本人去给女朋友送礼物求搞对象,但是最终,女朋友只认识戴笠。

           说起这个,我又想起了前几年看过的一个电视,名字是记不清了,只记得当时一家兄弟六个,一起到北京打工,其中老三和老四还自己自费报考了成人大学,在学校里,感性的老三认识了一个美丽而又成熟稳重的女孩,但是生性羞涩的老三不善言辞,不敢当面去向女孩子求爱,所以他就采用了最为古老的方式,写情书。写完了之后,让同在学校的弟弟老四去替她送过去,就这样,漫长的三年时光过去了,老三老四也到了结婚的年纪,当老三终于鼓起勇气向女孩当面求爱的时候,女孩子已经和弟弟老四在一起将近有半年时间了,而在此期间,哥哥还一直让弟弟给女孩送情书。真可谓是近水楼台先得月啊。闲话就不多说了,我们开始有这个故事,展开我们的代理模式。

    1、我们抛开他们最后的结果不谈,分析一下过程:

            1、老三和老四想做和做的事情是一样的,就是——送情书。

            2、从结果来看,女孩不知道老三的存在,只知道老四这个人。

            3、女孩是他们两个的共同目标。

    如果我们用类图来表示他们三者之间的关系:

           这张图呢,老三才是真正想追的女孩的人,老四只是在替老三送情书的过程中慢慢的日久生情,然后背叛老三的,至于那个女孩在哪里,就是我们的client端,访问或者接受情书的那个人。所以,最后我们总结说,女孩不知道(不需要知道)情书是谁写的,她只需要知道情书是老四送的就可以,虽然有点违背人伦情理,但是对于女孩来说,真的是这样。

           下面我们用代码来分析一啊:

    1. interface Action{  
    2.     void SongQingshu();  //定义一个送情书的接口  
    3. }  
    4.   
    5. class LaoSan:Action{    //定义一个真正写情书,想送情数的类,老三  
    6.     String Girl_Name;  
    7.     public LaoSan(String girl_name){  
    8.         Girl_Name=girl_name;  
    9.     }  
    10.     public void SongQingshu(){  
    11.         System.out.println("把情书送给:"+Girl_Name);  
    12.     }  
    13. }  
    14.   
    15. class LaoSi:Action{    //定义一个代理类Proxy,老四  
    16.     LaoSan ls;  
    17.     public LaoSi(String girl_name){  
    18.         ls=new LaoSan(girl_name);  
    19.     }  
    20.     public void SongQingshu(){  
    21.         ls.SongQingshu();  
    22.     }  
    23. }  


           从这段代码上我们能看到什么呢,从故事情节来说就是女孩只接受老四的情书,但是实际上却是老三的心血。从代码上的意义来说,是老三跟女孩子之间其实并没有什么关系或者说是交集,减少了两者之间的耦合性(联系),虽然这样的结果不好,但是事实终归是事实,所以奉劝广大男性同胞,不要再让人帮你递纸条了,最起码,纸条上也要写上自己的名字,不能为他人做嫁衣啊。

    2、说了这么多,代理模式有什么意义呢:

           首先说一下代理模式的三个要点,即代理模式中的三种重要角色:

           1、抽象角色:声明真实对象和代理对象的共同接口。

      2、代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

      3、真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

           代理模式的一个好处就是对外提供一个统一的接口,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行扩展或者说修改(不建议修改,开放封闭原则)。。Proxy代理实现接口方法operator(),另外还可以增加附加行为,然后调用真实对象的operator()。从而达到了“对修改关闭,对扩展开放”,保证了系统的稳定性。我们看客户端Client调用仍是接口A的接口方法operator(),只不过实例变为了ProxyA类了而已。也就是说代理模式实现了ocp原则。

    3、那什么时候适合使用代理呢?

           当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。例如:如果构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。一个代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。举个例子:

           我们上网,一个对象只有有限的访问权限,代理模式可以验证用户的权限。像我们的浏览器一般都有这个设置,代理。

  • 相关阅读:
    Bootstrap/Font-Awesome/sweetalert插件
    网络编程
    异常处理
    再看属性查找
    元类
    面向对象中的一些内置方法
    反射
    内置函数
    绑定方法与非绑定方法
    多态与鸭子类型
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/6018485.html
Copyright © 2020-2023  润新知