よりダイナミックにするために、デコレータパターンに代わるものを探しています。簡単な例として、次のコードがあるとします。
interface Resource {
public String getName();
}
interface Wrapper extends Resource {
public Resource getSource();
}
interface Readable extends Resource {
public InputStream getInputStream();
}
interface Listable extends Resource {
public List<Resource> getChildren();
}
class File implements Readable {
...
}
class Zip implements Listable, Wrapper {
public Zip(Readable source) { ... }
}
ご覧のとおり、ZipはReadableを直接実装していませんが、読み取り元のリソースは実装しています。zipを作成するとします。
Zip zip = new Zip(new File());
すべての機能が相互に関連しているわけではないため、すべてのインターフェイスをスタックして相互に拡張したくない(たとえば、Listable extends Readable)ことも、すべてのオブジェクトを構築してすべての機能を実装することもできません。オブジェクトをラップすることで、その場でオブジェクトを「装飾」できるようにします。
これは一般的な問題だと思いますが、それを解決するためのパターンはありますか?「ラッパー」インターフェースを使用すると、もちろん、必要に応じてリソースのチェーンを調べて機能をチェックできますが、これが正しいアプローチであるかどうかはわかりません。
アップデート
問題は、上記のとおり、すべての機能が関連しているわけではないため、インターフェイスの適切な階層を構築できないことです。たとえば、次の任意の新機能があるとします。
interface Rateable extends Resource {
public int getRating();
}
class DatabaseRateable implements Rateable, Wrapper {
public DatabaseRateable(Resource resource) { ... }
}
実行する場合:
Resource resource = new DatabaseRateable(new Zip(new File));
結果として得られるリソースは、追加されたすべての機能(読み取り可能、一覧表示可能など)を「失いました」。評価可能拡張をリスト可能と言うのはばかげているでしょう。
もう一度、resource.getSource()を再帰的にチェックして、すべての機能を見つけることができました。即時の返信では明確な解決策がなかったので、おそらく再帰的なチェックは結局のところ良いオプションですか?