【发布时间】:2012-08-26 07:38:22
【问题描述】:
背景
我的情况如下:
我有一个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) { ... }
并尝试使用decorator pattern解决它:
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。
(这是因为调整后的分析器与未调整的分析器不是同一个对象,它只是一个包装器,因此在AnalyzerImpl 中对computeValue 的调用无法按预期工作。)
TL;DR:
我想在运行时调整对象的行为。我使用了装饰器模式,但“丢失”了所有虚拟方法。
问题:
解决此问题的最佳方法是什么,即我应该如何调整 Analyzer 的行为,以便我不会丢失虚拟方法查找,或者我是否无关紧要做什么?
【问题讨论】:
-
这可能是一个愚蠢的问题,但是当你在做
return new AnalyzerDecorator(untweakedAnalyzer)时为什么不覆盖performAnalysis()? -
@Sujay,被覆盖的
performAnalysis应该如何看待?在我的实际代码中,AnalyzerImpl.performAnalysis是一个相当长且复杂的方法。我不想复制它:-/ -
也许你可以改用策略模式。
标签: java oop decorator virtual-functions