2014-07-17 78 views
-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無狀態,同時利用模板方法?

編輯)說明:接口和模板方法類的已發佈方法不能更改。

(注意,我已經解決了這個問題,並會回答它自己,但我給別人一個機會來解決它)

+0

您的模板類private方法不做任何事或返回常量字符串。很難認真考慮你的要求,不要改變這個班級。更實際的代碼可能會有所幫助。 –

+0

@DonRoby類可以改變,其發佈的方法不能。我保持代碼非常抽象,以便將注意力集中在技術問題上,而不會受到語義上的干擾,並且爲了簡潔起見。 您可以想象第一個委託方法會導致在第二個委派方法中需要使用從例如Map中獲取值的鍵。 – bowmore

回答

1

確定這裏就是答案我想出了,當我面對這樣的:

public class StatelessConcreteStrategy implements Strategy { 

    @Override 
    public void perform() { 
     new ConcreteStrategy().perform(); 
    } 
} 

StatelessConcreteStrategy是無狀態的。它具有任何其他無狀態類所具有的所有優點,通過將perform()委託給新的實例,它可以使用模板方法模式,並能夠在方法調用之間「記住」任何想要的數據。

事實上,你很可能想要ConcreteStrategy內聯或甚至匿名的內部類。