假设您要设计一个ConservativePerson类。
import java.util.List;
class ConservativePerson{ private boolean isVirgin; private boolean isMarried; private List<string> children; ConservativePerson(boolean virgin, boolean married, List<string> children) { this.isVirgin = virgin; this.isMarried = married; this.children = children; } public boolean isVirgin() { return isVirgin; } public boolean isMarried() { return isMarried; } public List<string> getChildren() { return children; }
}
因此,它具有一些约束。
- 他必须结婚,然后才能...好吧,不是处女。
- 据我们所知,在生孩子之前他不能是处女。
在过去,直到今天基本上都是过去……,您可能会为此类定义所有类型的修饰符方法,这些方法会在不变无效的情况下引发异常,例如NotMarriedException和VirginException 。 不再。
今天,我们将使用向导设计模式来完成此操作 。 我们使用流畅的界面样式,并在构建ConservativePerson对象时利用现代IDE的功能来创建类似向导的感觉。 我们知道,我们知道,不要再谈论了,并向我们展示代码……但是在展示向导代码之前,我们将向您展示其用法,以便您了解我们在说什么……
public class Main {
public static void main(String[] args) { ConservativePersonWizardBuilder wizard = new ConservativePersonWizardBuilder(); ConservativePerson singlePerson = wizard. createConservativePerson(). whichIsSingle(). getObject(); ConservativePerson familyManPerson = wizard. createConservativePerson(). whichIsMarried(). andNotVirgin(). andHasChildNamed("Noa"). anotherChildNamed("Guy"). lastChildName("Alon"). getObject(); } }
现在,它看起来像一个普通的流畅接口,但是这里很酷的事情是,只有在当前对象状态允许的情况下,方法才可以调用。 你将不能够调用的方法andNotVirgin这意味着如果你有没有调用的方法whichIsMarried。
请参见以下屏幕截图:
在我们声明他已结婚之后,我们可以:
这是向导代码。 我敦促您将其复制/粘贴到您的IDE中,并尝试使用它构建一个对象。
import java.util.ArrayList; import java.util.List; public class ConservativePersonWizardBuilder { private boolean isVirgin; private boolean isMarried; private List<String> children = new ArrayList<String>(); public SetMarriedStep createConservativePerson(){ return new SetMarriedStep(); } class SetMarriedStep { public SetVirginStep whichIsMarried(){ isMarried = true; return new SetVirginStep(); } public FinalStep whichIsSingle(){ isMarried = false; return new FinalStep(); } } class SetVirginStep { public AddChildrenStep andNotVirgin(){ isVirgin = false; return new AddChildrenStep(); } public FinalStep butStillAVirgin(){ isVirgin = true; return new FinalStep(); } } class FinalStep { public ConservativePerson getObject(){ return new ConservativePerson(isVirgin, isMarried, children); } } class AddChildrenStep { public AddChildrenStep andHasChildNamed(String childName) { children.add(childName); return new AddChildrenStep(); } public AddChildrenStep anotherChildNamed(String childName) { children.add(childName); return new AddChildrenStep(); } public FinalStep lastChildName(String childName){ children.add(childName); return new FinalStep(); } } }
如您所见,向导包含几个步骤。 每个步骤都由专用的内部类表示。 每个步骤都通过其方法揭示了合法的可用操作。 然后,每种方法都会根据所做的更改返回一个新步骤。 这样,将在编译时而不是运行时检测创建非法对象的尝试。
我们的生产代码中实际上使用了这种模式。 我想到的一个示例是MediaJob类。 此类描述对某些媒体文件的操作。 为了将作业提交给系统,必须创建一个MediaJob对象。 问题在于,该对象具有许多参数,这些参数可以分配与创建非法对象状态的矛盾值。 通过使用向导模式,可以轻松构建合法的工作,而无需了解整个(复杂的)约束集。
到此为止。 希望您能尝试一下。..我们计划在不久的将来对此进行更正式的描述(GOF风格)。
参考: DeveloperLife上我们JCG合作伙伴 Nadav Azaria和Roi Gamliel 的向导设计模式
翻译自: https://www.javacodegeeks.com/2012/01/wizard-design-pattern.html