关于Decorator的心得,求探讨

我觉得在Decorator模式中,如果实现装饰的Decorator只有一个的话,也就是说,只要给Decoratee增加一个工能的话,使用Decorator的优势并不是很大,Decorator模式的真正的威力在于对于一个被装饰(被油漆)的Decoratee提供多个Decorator的时候,也就是说,有多个额外的功能要被动态的刷到Decoratee中去,而这些功能在编译阶段并不能确定要具体增加那一些,而且增加的这些功能还有可能通过不同的组合完成不同的功能,这个时候使用Decorator模式的优势就很大了.比如下面几行代码中:
A a = new Decorator1 ( new Decorator2() );
a.doSomething();
A b = new Decorator2 ( new Decorator1() );
b.doSomething() ;
a.doSomething()和b.doSomething()完成的功能就可以完全不一样,如果不止两个Decorator的话,这样的组合就更多,通过不同的组合提供不同的功能就很简单了.我看到很多讲Decorator的例子基本上都是基于一个Decorator来给Decoratee刷上增值功能,<java 与模式>里的那个发票的例子讲得比较好,它通过两个Decoratoe(HeaderDecorator和FooterDecorator)来为同一个Decoratee(SalesOrder)提供不同的功能.大家可以参考探讨一下.

不错, Decorator模式重要一点是接口没有变。

接口没有变是根本,有另外一点也很重要,就是抽象Decorator要有一个被装饰类(具体类或者抽象类)的实例,通过这个实例来调用抽象接口的功能,而不是简单的在Decorator(抽象的或者具体的)的子类中直接通过super来调用.

后者和Adapter模式就类似了。

"Decorator模式的真正的威力在于对于一个被装饰(被油漆)的Decoratee提供多个Decorator的时候,也就是说,有多个额外的功能要被动态的刷到Decoratee中去,而这些功能在编译阶段并不能确定要具体增加那一些,而且增加的这些功能还有可能通过不同的组合完成不同的功能,这个时候使用Decorator模式的优势就很大了."

被装卸的功能多了,很可能就变成灾难了。如果A a = new Decorator1 ( new Decorator2() );是可以接受的话,那么A a = new Decorator1 ( new Decorator2(new Decorator3(new Decorator4(new Decorator5(new Decorator6(new Decorator7()))))) );的感觉如何。
并且,实际使用中,并不是new Decorator1,2,3这种规则排列,而是一堆名字相似的CLASS互为构造器的入参。想体念这种感觉,写一个特别复杂的JAVA IO就可以体念到了。个人认为,这种代码难写难读,也就谈不上好维护了。

本质上,Decorator通过继承增加功能,当功能组合特别复杂时,n层的继承就不可避免了。这种情况下,倒不如增加一个组合上述功能的代理类,感觉更好一些。这样,就用n个类的组合代替了n层的继承。接口也不会发生变化。

纯Decorator模式,只合适用在增加2-4个功能的情况吧.

是这样,Decorator模式本身就是刷油漆的意思,油漆本身就是有轻、薄的含义。

如果增加功能很多,复杂,那根据设计目标选择其它模式了。