-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