向导设计模式
假設您要設計一個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
總結
                            
                        - 上一篇: 图形教程
 - 下一篇: 派出所备案的条件是什么(派出所备案的条件