【问题标题】:Stateless Template method implementation无状态模板方法实现
【发布时间】:2014-07-17 17:43:27
【问题描述】:

假设我有一个策略界面:

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 无状态,同时利用模板方法?

(edit) 说明:接口和模板方法类发布的方法都不能改变。

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

【问题讨论】:

  • 您的模板类私有方法要么什么都不做,要么返回常量字符串。很难认真对待你不改变这个类的要求。更真实的代码可能会有所帮助。
  • @DonRoby 类可以更改,其发布的方法不能。我保持代码相当抽象,以保持对技术问题的关注,没有语义分心,也为了简洁。您可以想象第一个委托方法会产生一个键,例如,在第二个委托方法中需要使用该键从 Map 中获取值。

标签: java stateless template-method-pattern


【解决方案1】:

好的,这是我在遇到这个问题时想出的答案:

public class StatelessConcreteStrategy implements Strategy {

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

StatelessConcreteStrategy 是无状态的。它具有任何其他无状态类的所有优点,并且通过将 perform() 委托给一个新的 ConcreteStrategy 实例,它可以使用模板方法模式,并且能够“记住”它想要在方法之间的任何数据来电。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多