设计模式之代理模式和装饰者模式的区别(java)

           为了能让自己写出更优美的代码,最近开始学习设计模式方面的知识。之前只在项目中简单的使用过单例模式和观察者模式,对于其他的几种(据说有23种)设计模式都有些混淆不清。以后一定要把每一种的梳理清楚。

        以前在学习设计模式的时候可能有一点急功近利,总是直接找网上的设计模式的代码来看,对设计模式本身的设计思想理解不够明确,再加上网上的一些代码也有张冠李戴之嫌,所以代理模式(Proxy)和装饰者模式(Decorator)之间的区别一直搞不清。

        装饰者模式的设计思想:在不必改变原类文件和不使用继承的情况下,动态地扩展一个对象的功能。在面向对象的语言中,扩展一个对象的功能,主要就是通过修改类文件内容或者使用继承。如果当你不能修改类文件的内容或者不想使用继承的情况下,就可以考虑使用装饰者模式。

       装饰者模式的主要角色:抽象接口类,装饰者类(实现抽象接口类,并提供扩展功能),被装饰者类(是抽象接口类的具体实现者)。

       //抽象接口类

  public interface Subject {
      void sayHello();
  }

        //被装饰者类  

  class Decorated implements Subject {
      @Override
      public void sayHello() {
          System.out.println("Hello World!");
      }
  }

       //装饰者类

  public class Decorator implements Subject {
      Decorated decorated;

      public Decorator(Decorated decorated) {
          this.decorated = decorated;
      }

      @Override
      public void sayHello() {
          decorated.sayHello();
      }

      public void sayHi() {
          System.out.println("Hi World!");
      }

      public void sayMessage() {
          this.sayHi();
          this.sayHello();
      }
}
其实就是多用聚合,少用继承( 除非必要 )的思想。


        代理模式的设计思想:为其他对象提供一种代理以控制对这个对象的访问。可以看出,代理模式的设计思想是对被代理对象的访问控制。

       代理模式的主要角色:抽象接口类,代理角色,真实角色。

       //抽象接口类:

   public interface Subject {
       void sayHello();
   }
        //真实角色

   class RealObject implements Subject {
       @Override
       public void sayHello() {
           System.out.println("Hello World!");
       }
   }
        //代理角色:

   public class Proxy implements Subject{
       RealObject realObject;

       public Proxy() {
           realObject = new RealObject();
       }

       @Override
       public void sayHello() {
          realObject.sayHello();
       }
    }

代码两者看起来很像吧?都继承了一个抽象角色,都持有被代理或者被装饰者的对象。但是仔细观察可以发现区别:装饰者模式的设计思想是为了给对象提供动态扩展的功能,所以装饰者和被装饰者对象的关系是在运行时确定的(在创建装饰者对象时通过构造函数传入被装饰者对象)。代理模式是为了控制对对象的访问,所以使用者不需要关心被代理对象的创建,而是采用编译时就确定代理角色和真实角色关系的方式。


如果有错误或者不严谨的地方欢迎指出。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值