装饰模式的使用情况到底是什么情况
几乎所有叙述装饰模式的应用情况,都是原封不动的三点叙述
1.需要扩展一个类的功能,或给一个类增加附加责任;
2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销;
3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
在下有一些疑问请大家来探讨
1.
附加责任是什么情况?什么叫
扩展一个类的功能我认为有以下两个例子都属于情况1
a)具体装饰类增加了一个被装饰类没有的方法。例如Logger装饰类的具体类HTMLLogger除了重载了log方法,还增加了一个方法:把处理信息转化为HTML文档。 参见http://www.javaresearch.org/article/39753.htm
b)具体装饰类的一个实现接口的方法除了委派给父类(调用被装饰类的同名方法)外,还在该方法内添加了其它功能
2.怎么理解动态地给一个对象增加功能?
这一点我不明白。什么叫做“增加功能”“给一个对象增加功能”“动态地给一个对象增加功能”。对象是类的具体实例,那对象怎么还能够增加功能?即使把这里的汉字“对象”理解为Java中的Class,那么功能又怎么能“动态地”增加。
迄今为止,我还没有看到众人的举例包含了情况2
3.当一个类被继承后要实现若干其它的一些基本功能(接口),那么放弃这种继承,而使这个类被装饰。让装饰类(的子类)来现实具体的扩展功能。参见http://space.zdnet.com.cn/html/05/250805-1471.html
欢迎大家来探讨
------解决方案--------------------在java的面向对象设计中有一个很重要的原则就是组合聚合原则,通过组合聚合实现对一个对象的封装。对象不是Java中的Class,而是JVM运行期间生成的java的class的实例,一个类在设计好之后,本身是不可改变的,这是一种静态性,而根据这个类创建的对象,可以根据封装的不同,创建不同的对象。拿这里说的装饰模式来说,一个具体构件提供了一种功能,而我的装饰构件,则是通过实现对具体构建的封装,在其封装的那个具体构建的基础之上,再实现一些附加性的操作,而装饰构件可以装饰不同的具体构建,从而实现不同功能,这就是一种动态性。在java io的API中就是使用了这样的设计模式。装饰模式中描述的给一个对象增加功能,并不是说,把功能插入到该对象中,而是通过另一个对象来封装该对象,最终获得的那个功能扩展了的对象,是后一个对象。java io就是个很好的例子