デコレータ パターンを使用してオブジェクトの動作を変更しようとしていますが、デコレータ パターンがオブジェクトの機能を希望どおりに変更できないように思われる問題が発生しました。
これが私がやろうとしていることの簡単な例です:
int のゲッターと、ゲッターを使用して計算を行うその他の「複合体」を持つクラスがあります。
public class MyClass implements MyInterface {
private int value = 5;
@Override
public int getValue() {
return value;
}
@Override
public int complexStuff() {
return 50 + getValue();
}
}
インターフェイスによって定義されたすべての呼び出しを MyClass インスタンスに渡すだけの抽象デコレータがあります
public abstract class MyDecorator implements MyInterface {
private MyClass decorated;
public MyDecorator(MyClass decorated) {
this.decorated = decorated;
}
@Override
public int getValue() {
return decorated.getValue();
}
@Override
public int complexStuff() {
return decorated.complexStuff();
}
}
MyClass
インスタンスを装飾して、影響を受けるgetValue()
ような方法でメソッドの動作を変更できるようにしたいと考えていますcomplexStuff()
。
たとえば、次のように MyClass インスタンスを装飾するとします。
MyDecorator myDecorator = new MyDecorator(myClassInstance) {
@Override
public int getValue() {
return 100;
}
};
私が現在これを実装している方法では、 への呼び出しmyDecorator.getValue()
は 100 を返しますが、 への呼び出しはインスタンスが装飾されていないmyDecorator.complexStuff()
かのように 55 を返します。MyClass
私が欲しいのは、への呼び出しがmyDecorator.complexStuff()
150 を返すことです。
目的の結果を得るためにデコレータ パターンの使用を変更する方法はありますか? または、これを希望どおりに機能させるために使用できる他のパターン/ソリューションはありますか?
ありがとう