设计模式-代理模式(和装饰模式的真正区别)

 最近有时间,学习了一下设计模式,发现了一个问题,代理模式(静态代理)在写法和结构上,基本和装饰器是一样的。

由此引发了对这两者的真正区别的思考,网上搜索了许许多多的答案(虽然都有一定的道理,个人觉得都没有说到真正的重点) :

  1 . 有的人说是结构上不同,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰器能够在运行时递归地被构造(我个人完全反对这种说法);

  2 . 装饰器模式为了增强功能;而代理模式是为了加以控制,代理类对被代理的对象有控制权,决定其执行或者不执行。(大名鼎鼎的菜鸟教程这样解释);

  3 . 甚至还有人说装饰器模式用于添加新方法;而代理模式则用于增强原方法(那为什么叫代理?)。

 

代理模式(静态)与装饰者虽然在结构上基本上一模一样,但两者却有真正区别,我认为是 : 目的不一样关注的重心不一样

  代理模式目的 : 让原有对象被代理,我们的目的是让使用者尽可能的感受不到原有对象,原有对象的行为或额外的动作交由代理对象完成。(完成代理模式的真正意义)

  装饰器模式目的 : 让原有对象被增强,我们的目的通常是得到由原有对象被增强后的装饰器对象行为。(完成装饰器模式的真正意义)

  代理模式关注重心 : 主要功能不变,代理对象只是帮忙代理或稍加扩展原有对象的行为,功能上主要关心原有对象所具有的行为。(最终主要功能仍然由原有对象决定)

  装饰器模式关注重心 : 主要功能增强,使用装饰器目的就是为了增强,功能上更关心装饰增加后的行为。(最终主要功能由装饰对象决定)

 

静态代理

静态代理的角色分为 : 抽象行为角色,委托人,代理人。基本写法如下 : 

  抽象行为角色 : 是委托人和代理人的共同接口。这里我们叫它抽象主题(Subject) : 

复制代码
package name.ealen.proxy.designPattern.staticProxy;  /**  * Created by EalenXie on 2018/11/2 10:16.  */public interface Subject {      public void operation();  }
复制代码

       

  委托人 : 也就是我上面一直说的原有对象,真正被代理的对象,也叫做代理元。这里我们叫它真实主题 (RealSubject): 

复制代码
package name.ealen.proxy.designPattern.staticProxy;  /**  * Created by EalenXie on 2018/11/2 10:17.  */public class RealSubject implements Subject {      @Override     public void operation() {         System.out.println("真实对象 : 重要操作");     }  }
复制代码

 

  代理人 : 代理角色,由它去代理原有对象。它包含被代理对象的引用,这里叫它代理主题(ProxySubject):  

复制代码
package name.ealen.proxy.designPattern.staticProxy;  /**  * Created by EalenXie on 2018/11/2 10:18.  */public class ProxySubject implements Subject {     private Subject subject;      public ProxySubject(Subject subject) {         this.subject = subject;     }      /**      * 目的 : 代理真实对象完成方法调用,代理可以进行相对不重要的行为扩展      */     @Override     
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信