【发布时间】:2014-07-17 17:43:27
【问题描述】:
假设我有一个策略界面:
public interface Strategy {
void perform();
}
以及实现它的模板方法:
public abstract class AbstractStrategy implements Strategy {
@Override
public void perform() {
String firstInfo = doStuff();
String secondInfo = firstDelegationToImplementor(firstInfo);
String thirdInfo = processSecondInfo(secondInfo);
String fourthInfo = secondDelegationToImplementor(thirdInfo);
finalProcessing(fourthInfo);
}
private void finalProcessing(String fourthInfo) {
//TODO automatically generated method body, provide implementation.
}
protected abstract String secondDelegationToImplementor(String thirdInfo);
protected abstract String firstDelegationToImplementor(String firstInfo);
private String processSecondInfo(String secondInfo) {
return "thirdResult";
}
private String doStuff() {
return "firstResult";
}
}
我有一个具体的子类:
public class ConcreteStrategy extends AbstractStrategy {
private String firstInfo;
@Override
protected String secondDelegationToImplementor(String thirdInfo) {
return someMoreProcessing(firstInfo, thirdInfo);
}
private String someMoreProcessing(String firstInfo, String thirdInfo) {
return null;
}
private String someProcessing(String firstInfo) {
return null;
}
@Override
protected String firstDelegationToImplementor(String firstInfo) {
this.firstInfo = firstInfo;
return someProcessing(firstInfo);
}
}
但由于它需要记住方法调用之间的一些中间结果,它不是无状态的。无状态类有几个优点,例如它们是自动线程安全的。
所以问题是:我怎样才能使 ConcreteStrategy 无状态,同时利用模板方法?
(edit) 说明:接口和模板方法类发布的方法都不能改变。
(注意,这个问题我已经解决了,会自己回答,但我会给别人一个机会来解决它)
【问题讨论】:
-
您的模板类私有方法要么什么都不做,要么返回常量字符串。很难认真对待你不改变这个类的要求。更真实的代码可能会有所帮助。
-
@DonRoby 类可以更改,其发布的方法不能。我保持代码相当抽象,以保持对技术问题的关注,没有语义分心,也为了简洁。您可以想象第一个委托方法会产生一个键,例如,在第二个委托方法中需要使用该键从 Map 中获取值。
标签: java stateless template-method-pattern