2014-07-17 38 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内联或甚至匿名的内部类。