这个基于Java状态的设计模式的名称是什么?
在我的工作中,我们有调查,一次调查涉及多个步骤。我从事自动化工作,所以我围绕我们为这些调查创建的页面对象设计测试。我们将此特定调查称为“流程”调查,因为它有多个步骤。因此,您可以跳过步骤1(调查A),然后完成或跳过步骤2(调查B),然后完成或跳过步骤3(调查C)。天真地说,我们可以编写一个测试,其方法如下所示:这个基于Java状态的设计模式的名称是什么?,java,design-patterns,Java,Design Patterns,在我的工作中,我们有调查,一次调查涉及多个步骤。我从事自动化工作,所以我围绕我们为这些调查创建的页面对象设计测试。我们将此特定调查称为“流程”调查,因为它有多个步骤。因此,您可以跳过步骤1(调查A),然后完成或跳过步骤2(调查B),然后完成或跳过步骤3(调查C)。天真地说,我们可以编写一个测试,其方法如下所示: public void completeSurveyA() { //... } public void skipSurveyB() { //... } public vo
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());
}
}
例如:
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我想要更具描述性的东西“=>这是一个流畅的界面。我完全同意,流畅的界面比经典的状态模式方法更具描述性和清晰。此外,它没有那么冗长。生成器是一种特定类型的流畅界面,专门用于构建某些东西。