无状态模板方法实现

时间:2014-07-17 17:43:28

标签: java stateless template-method-pattern

我们说我有一个策略界面:

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无状态?

编辑)澄清:接口和模板方法类的已发布方法无法更改。

(注意,我已经解决了这个问题并将自己回答,但我会给别人一个解决问题的机会)

1 个答案:

答案 0 :(得分:1)

好的,这就是我面对这个问题时得出的答案:

public class StatelessConcreteStrategy implements Strategy {

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

StatelessConcreteStrategy是无国籍的。它具有任何其他无状态类所具有的所有好处,并且通过将perform()委派给新的ConcreteStrategy实例,它可以使用模板方法模式,并且能够记住'方法调用之间想要的任何数据。

事实上,您很可能希望将ConcreteStrategy内联到内部甚至匿名的内部类中。