这个基于Java状态的设计模式的名称是什么?

这个基于Java状态的设计模式的名称是什么?,java,design-patterns,Java,Design Patterns,在我的工作中,我们有调查,一次调查涉及多个步骤。我从事自动化工作,所以我围绕我们为这些调查创建的页面对象设计测试。我们将此特定调查称为“流程”调查,因为它有多个步骤。因此,您可以跳过步骤1(调查A),然后完成或跳过步骤2(调查B),然后完成或跳过步骤3(调查C)。天真地说,我们可以编写一个测试,其方法如下所示: public void completeSurveyA() { //... } public void skipSurveyB() { //... } public vo

在我的工作中,我们有调查,一次调查涉及多个步骤。我从事自动化工作,所以我围绕我们为这些调查创建的页面对象设计测试。我们将此特定调查称为“流程”调查,因为它有多个步骤。因此,您可以跳过步骤1(调查A),然后完成或跳过步骤2(调查B),然后完成或跳过步骤3(调查C)。天真地说,我们可以编写一个测试,其方法如下所示:

public void completeSurveyA() {
    //...
}
public void skipSurveyB() {
    //...
}
public void completeSurveyB() {
    //...
}
public void skipSurveyC() { 
    //...
}
public void completeSurveyC() {
    //...
}
你会像这样使用它吗

completeSurveyA();
skipSurveyB();
completeSurveyC();
new SurveyFlow().completeSurveyA().skipSurveryB().completeSurveyC();
但是,这可能是一个问题,因为在调用
completeSurveyA()
之前,我们可能会调用
completeSurveyB()
,调用
completeSurveyA
两次,等等,测试就会中断。为了避免这种情况,我引入了另一种方法,在surveyA上调用方法将返回surveyB对象,这将返回surveyC对象

public class SurveyFlow() {
    public SurveyB completeSurveyA() {
        //...
        return new SurveyB();
    }
    private class SurveyB() {
        public SurveyC skipSurveyB() {
            //...
            return new SurveyC();
        }
        public SurveyC completeSurveyB() {
            //...
            return new SurveyC();
        }
        private class SurveyC() {
            public void skipSurveyC() {
                //...
            }
            public void completeSurveyC() {
                //...
            }
        }
    }
}
你会像这样使用它吗

completeSurveyA();
skipSurveyB();
completeSurveyC();
new SurveyFlow().completeSurveyA().skipSurveryB().completeSurveyC();

该模式让我想起了状态机,因为在不同的状态下,您只能使用某些方法,但我想知道该模式是否有更具体的名称。

这在某种程度上是状态模式,但并不完全符合GoF描述的状态模式,因为您并没有改变单个对象的状态,而是创建并返回一个不同类的新对象,然后再使用它


实际上,这更类似于构建器模式,其中
completeSurveyC()
充当
build
getResult
方法,从前面指定的多个组成部分构建
Surway

根据示例的类,它是:

关于这种风格,可能需要注意的最重要的一点是,它的意图是按照内部DomainSpecific语言的思路做一些事情。(…)API主要设计为可读性和流动性

这不是构建器模式,因为您没有构建任何东西(即,您没有最终的
build()
方法,在该方法中,前面步骤中收集的数据用于创建实例)

这也不是状态模式,因为操作(
skip()
complete()
在本例中)不依赖于对象的状态(实际上步骤没有状态)

如果将整个调查建模为一个对象,并使用一种方法,该方法的实现取决于不同的状态,那么这就是状态模式(在这种情况下,状态将是步骤加上所采取的操作,即
surveyACompleted
surveyaskiped
surveyBCompleted
surveyBSkipped
,等等,而方法类似于
nextStep()
):

状态将由
SurveyFlow
的每个步骤以多态方式表示:

abstract class SurveyState {

    protected abstract void takeStep(boolean skipNext, SurveyFlow survey);
}
调查A国家将如下:

class SurveyACompleted extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyBSkipped() : new SurveyBCompleted());
    }
}

class SurveyASkipped extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyBSkipped() : new SurveyBCompleted());
    }
}
class SurveyBCompleted extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyCSkipped() : new SurveyCCompleted());
    }
}

class SurveyBSkipped extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyCSkipped() : new SurveyCCompleted());
    }
}
调查B国家情况如下:

class SurveyACompleted extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyBSkipped() : new SurveyBCompleted());
    }
}

class SurveyASkipped extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyBSkipped() : new SurveyBCompleted());
    }
}
class SurveyBCompleted extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyCSkipped() : new SurveyCCompleted());
    }
}

class SurveyBSkipped extends SurveyState {

    protected void takeStep(boolean skipNext, SurveyFlow survey) {
        // ...

        survey.setState(skipNext ? new SurveyCSkipped() : new SurveyCCompleted());
    }
}
例如:

  • 完成调查A
  • 跳过调查B
  • 全面调查C
  • 你可以做:

    SurveyFlow survey = new SurveyFlow(false); // will complete survey A
    survey.takeStep(true);                     // completed survey A and will skip survey B
    survey.takeStep(false);                    // skipped survey A and will complete survey C
    survey.takeStep(true);                     // completed survey C
    

    如果调查C是最后一步,那么它可以忽略
    布尔值
    参数,不应该设置进一步的步骤。

    对我来说听起来像是状态模式。在状态机和流畅的界面之间交叉。流出?!这似乎是a的一个特例。你能跳过一步,稍后再返回吗?同样,你能完成一个步骤,但没有完成吗呃,对答案感到遗憾并修改它?当概念明确时,我相信你会找到一个合适的名称。如果有一个现有的模式,那很好,但不是很有趣。记住,在计算机科学中只有两件困难的事情:命名、缓存失效和一个一个错误的关闭;)你说的是什么“当你现在展示你的类时”?你的更具状态模式风格的方法的例子是我最初的方法,但我想要更具描述性的东西——当人们调用
    takeStep
    时,除非他们知道每个步骤的实现。@michaelsnowden我想要更具描述性的东西“=>这是一个流畅的界面。我完全同意,流畅的界面比经典的状态模式方法更具描述性和清晰。此外,它没有那么冗长。生成器是一种特定类型的流畅界面,专门用于构建某些东西。