关于“装饰者模式”的一点粗浅理解

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构(主要目的在于增强接口,而不是扩展接口)。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

黑体字就是关键字,要想用好该模式,就必须体会着几个关键字的意图;

在 Head First设计模式 书中提了这样一个例子,原先有各种饮料,饮料具有Beverage基类,在该基类下有好几个实现类如Tea,Coffee,等;注意此时是已经有了基类,但是由于当时没有很好的设计该系统,现在遇到了新需求,要求推出奶味Tea,摩卡咖啡等等;

注意到,该模式主要用在之前设计系统时没有很好的考虑未来需求(如果你预料到了新需求,你或许会使用其他方式,此时装饰器模式就可能不具备竞争力了),现在要添加新功能为类添加新功能,出于代码复用观点(你要是已经发布的源码,那当我没说,基本的:对扩展开放,对修改关闭原则),不改变结构,此时你可以考虑使用装饰器模式去适应新需求;他是怎么做的呢?

不妨分析JDK代码:

最为经典的使用就是jdk的Stream相关了

如下:

如上FilterInputStream继承了InputStream,但是没有提供比InputStream更多的功能,目的在于增强InputStream接口,而FilterInputStream内部还使用了一个InputStream的域,基于此InputStream在实现中增强接口,这是其精华所在,这就是典型的装饰者模式类图;

当然了,装饰者模式是比较简单的了,但正是因为简单,很多人或许没完全明白其使用就在类名上体现出来给人造成误解;

比如 往往拿来与之讨论的就是Proxy(代理)模式,两者有着几乎相似的类图,如下:

这是装饰者

这是代理模式

两者都是利用组合来达到目的 ;

实际上,很多模式都是使用组合来达到目的,一直在强调目的两个字,事实上模式之间的不同大多源于其目的不同,实现上是很类似的;

装饰者模式目的在于“包装同一接口对象,并在此基础上提供额外功能”;

适配器模式目的在于“包装不同接口的对象,将其转化为指定接口的对象”;

代理模式目的在于“包装同一接口对象,并控制其访问”;

在这种意义上来说,AOP总体上是装饰者模式(增加了新功能),但其内部使用的代理对象属于代理模式(获得了代理对象);

其实,真正的纯代理模式就是远程代理,目的是控制对象访问的,如防火墙代理,RPC对象等等,都是这样,没有增加新功能,达到的目的是控制对象访问!

猜你喜欢

转载自blog.csdn.net/WK_SDU/article/details/82180959