2

在 Java 中,我使用的是装饰器模式。有时一个Object可以有很多类型,因为它可以用很多类来装饰。我怎样才能得到一个对象的所有不同类型?

abstract class: plate
concrete class: JapanesePlate, WesternPlate

abstract plateDecorator extends plate
concrete decorators: MeatPlateDecorator, TomatoPlateDecorator,

有时, aJapanesePlate可以用MeatPlateDecoratorTomatoPlateDecorator或两者装饰。

我只是想知道是否有任何方法可以知道这一点?

4

3 回答 3

2

您无法找到形成任意装饰层次结构的所有类,因为装饰器具有装饰类的实例,并且不形成is-a关系。

举一个来自 JDK 的具体示例:BufferedInputStream是输入流的装饰器。它是包含FilterInputStreamand的类层次结构的一部分InputStream,但它不会告诉您它正在装饰的类。

如果你碰巧知道它BufferedInputStream是如何实现的,你可以使用反射来检查它正在装饰的流,但这并不能帮助你检查,比如说BufferedOutputStream.

于 2013-02-18T18:42:52.497 回答
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.
   }
于 2013-02-18T18:35:15.937 回答
0

如果您控制类层次结构,最好的选择可能是引入装饰器接口:

public interface Decorator<T> {
    T getDecoratedObject();
}

现在你的装饰器 walk 可以检查特殊Decorator接口并撬开包装的对象。

如果你不能改变类,你可能不得不依赖反射黑客和启发式。

于 2013-02-18T18:53:54.620 回答