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

来源:互联网 发布:游戏m美工招聘' 编辑:程序博客网 时间:2024/06/03 12:20

           为了能让自己写出更优美的代码,最近开始学习设计模式方面的知识。之前只在项目中简单的使用过单例模式和观察者模式,对于其他的几种(据说有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
原创粉丝点击