バックグラウンド
私は次のような状況にいます:
Analyzer
おおよそ次のようなタイプがあります
interface Analyzer {
int computeValue();
String performAnalysis();
}
のようなものによって実装
class AnalyzerImpl implements Analyzer {
@Override
public int computeValue() {
return 5;
}
@Override
public String performAnalysis() {
return "Result: " + computeValue();
}
}
(私の実際のコードでは、さまざまな複雑さのperformAnalysis
いくつかの異なるcomputeValue
方法を使用して多くの計算を実行します。)
ここで、実行時にオブジェクトの動作を選択的に微調整する必要がありAnalyzer
ます (または、微調整された動作でラッパーを作成します)。
私が試したこと:
微調整方法を追加しました:
public Analyzer tweakAnalyzer(Analyzer untweakedAnalyzer) { ... }
デコレータパターンを使用して解決しようとしました:
class AnalyzerDecorator implements Analyzer {
Analyzer delegate;
public AnalyzerDecorator(Analyzer delegate) {
this.delegate = delegate;
}
@Override
public int computeValue() {
return delegate.computeValue();
}
@Override
public String performAnalysis() {
return delegate.performAnalysis();
}
}
tweakAnalyzer
次に、次のように実装しました。
public Analyzer tweakAnalyzer(Analyzer untweakedAnalyzer) {
return new AnalyzerDecorator(untweakedAnalyzer) {
@Override
public int computeValue() {
return 1337; // tweaked value!
}
};
}
ただし、行うときは
tweakAnalyzer(new AnalyzerImpl()).performAnalysis();
調整されていない値 が得られますが、希望どおりResult: 5
ではありませんResult: 1337
。
(これは、微調整されたアナライザーが微調整されていないアナライザーと同じオブジェクトではなく、単にラッパーであるためです。そのため、 in の呼び出しがcomputeValue
意図したとおりにAnalyzerImpl
機能しません。)
TL;DR:
実行時のオブジェクトの動作を微調整したい。デコレータ パターンを使用しましたが、すべての仮想メソッドが「失われました」。
質問:
この問題を解決する最善の方法は何ですか?つまりAnalyzer
、仮想メソッドのルックアップを失わないように、または失われても問題にならないように、の動作を微調整するにはどうすればよいでしょうか?