背景
我处于以下情况:
我有一个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
预期的值。
(这是因为经过调整的分析器与未调整的分析器不是同一个对象,它只是一个包装器,因此对computeValue
in的调用AnalyzerImpl
无法按预期工作。)
TL;博士:
我想在运行时调整对象的行为。我使用了装饰器模式,但“丢失”了所有虚拟方法。
问题:
解决此问题的最佳方法是什么,即我应该如何调整 an 的行为,以Analyzer
使我不会丢失虚拟方法查找,或者如果我这样做也没关系?