2

Java では、decorator パターンを使用しています。Objectは、多くのクラスで装飾できるため、多くの型を取得する場合があります。オブジェクトのさまざまなタイプをすべて取得するにはどうすればよいですか?

abstract class: plate
concrete class: JapanesePlate, WesternPlate

abstract plateDecorator extends plate
concrete decorators: MeatPlateDecorator, TomatoPlateDecorator,

場合によっては、aを 1つ または両方JapanesePlateで装飾できます。MeatPlateDecoratorTomatoPlateDecorator

これを知る方法があるかどうか知りたいだけですか?

4

3 に答える 3

2

デコレータには-装飾されたクラスのインスタンスがあり、is-関係を形成しないため、任意の装飾階層を形成するすべてのクラスを見つけることはできません。

JDKの具体例として、BufferedInputStreamは入力ストリームのデコレータです。FilterInputStreamこれは、とを含むクラス階層の一部ですが、それが装飾InputStreamしているクラスについては何も教えてくれません。

実装方法を知っている場合BufferedInputStreamは、リフレクションを使用して、それが装飾しているストリームを調べることができますが、それは調べるのに役立ちませんBufferedOutputStream

于 2013-02-18T18:42:52.497 に答える
0

クラス階層を制御する場合、おそらく最良のオプションはデコレータインターフェイスを導入することです。

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

これで、デコレータウォークで特別なDecoratorインターフェイスを確認し、ラップされたオブジェクトもこじ開けることができます。

クラスを変更できない場合は、おそらくリフレクションハッカーとヒューリスティックに依存する必要があります。

于 2013-02-18T18:53:54.620 に答える
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 に答える