为了能让自己写出更优美的代码,最近开始学习设计模式方面的知识。之前只在项目中简单的使用过单例模式和观察者模式,对于其他的几种(据说有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(); } }
代码两者看起来很像吧?都继承了一个抽象角色,都持有被代理或者被装饰者的对象。但是仔细观察可以发现区别:装饰者模式的设计思想是为了给对象提供动态扩展的功能,所以装饰者和被装饰者对象的关系是在运行时确定的(在创建装饰者对象时通过构造函数传入被装饰者对象)。代理模式是为了控制对对象的访问,所以使用者不需要关心被代理对象的创建,而是采用编译时就确定代理角色和真实角色关系的方式。
如果有错误或者不严谨的地方欢迎指出。