-1
比方说,我有一个策略接口:无国籍模板方法实现
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);
}
}
但由于它需要记住方法调用之间的一些中间结果,它不是statel ESS。无状态类有几个优点,例如自动线程安全。
所以问题是:如何使ConcreteStrategy无状态,同时利用模板方法?
(编辑)说明:接口和模板方法类的已发布方法不能更改。
(注意,我已经解决了这个问题,并会回答它自己,但我给别人一个机会来解决它)
您的模板类private方法不做任何事或返回常量字符串。很难认真考虑你的要求,不要改变这个班级。更实际的代码可能会有所帮助。 –
@DonRoby类可以改变,其发布的方法不能。我保持代码非常抽象,以便将注意力集中在技术问题上,而不会受到语义上的干扰,并且为了简洁起见。 您可以想象第一个委托方法会导致在第二个委派方法中需要使用从例如Map中获取值的键。 – bowmore