Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无状态模板方法的实现_Java_Stateless_Template Method Pattern - Fatal编程技术网

Java 无状态模板方法的实现

Java 无状态模板方法的实现,java,stateless,template-method-pattern,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 = f

假设我有一个策略界面:

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

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


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

好的,这是我面对这个问题时想到的答案:

public class StatelessConcreteStrategy implements Strategy {

    @Override
    public void perform() {
        new ConcreteStrategy().perform();
    }
}
无状态策略
是无状态的。它具有任何其他无状态类所具有的所有优点,并且通过将perform()委托给新的
ConcreteStrategy
实例,它可以使用模板方法模式,并且能够在方法调用之间“记住”它想要的任何数据


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

您的模板类私有方法要么不执行任何操作,要么返回常量字符串。很难认真对待你不改变这门课的要求。更现实的代码可能会有所帮助。@DonRoby类可以更改,但其发布的方法不能更改。我将代码保持得相当抽象,以便将重点放在技术问题上,而不会分心语义,也为了简洁。您可以想象第一个委托方法会产生一个键,例如,在第二个委托方法中,需要使用该键从映射中获取值。