在Java中,我正在使用装饰器模式。有时,Object
会获得许多类型,因为它可以使用许多类进行修饰。我怎样才能获得所有不同类型的对象?
abstract class: plate
concrete class: JapanesePlate, WesternPlate
abstract plateDecorator extends plate
concrete decorators: MeatPlateDecorator, TomatoPlateDecorator,
有时,JapanesePlate
可以使用MeatPlateDecorator
或TomatoPlateDecorator
或两者进行修饰。
我只想知道是否有任何方法可以解释这个问题?
答案 0 :(得分:2)
您无法找到构成任意装饰层次结构的所有类,因为装饰器具有装饰类的实例,并且不会形成 is-a 关系。
对于JDK的具体示例:BufferedInputStream是输入流的装饰器。它是包含FilterInputStream
和InputStream
的类层次结构的一部分,但它不会告诉您它正在装饰的类。
如果你碰巧知道如何实现BufferedInputStream
,你可以使用反射来检查它正在装饰的流,但这对你的检查没有帮助,比如BufferedOutputStream
。
答案 1 :(得分:0)
使用getSuperClass。如果需要,您还可以使用getInterfaces
:
Class objectClass = object.getClass();
while (objectClass != null) {
Class parent = objectClass.getSuperClass();
Class [] implementedInterfaces = objectClass.getInterfaces()
objectClass = parent; // continue upward in the hierarchy.
}
答案 2 :(得分:0)
如果你控制类层次结构,你最好的选择可能就是引入一个装饰器界面:
public interface Decorator<T> {
T getDecoratedObject();
}
现在你的装饰师走路可以检查特殊的Decorator
界面,并且也可以打开包裹的对象。
如果你不能改变课程,你可能不得不依赖反思hackery和启发式。