向导设计模式
假設(shè)您要設(shè)計(jì)一個(gè)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; } }因此,它具有一些約束。
- 他必須結(jié)婚,然后才能...好吧,不是處女。
- 據(jù)我們所知,在生孩子之前他不能是處女。
在過(guò)去,直到今天基本上都是過(guò)去……,您可能會(huì)為此類定義所有類型的修飾符方法,這些方法會(huì)在不變無(wú)效的情況下引發(fā)異常,例如NotMarriedException和VirginException 。 不再。
今天,我們將使用向?qū)гO(shè)計(jì)模式來(lái)完成此操作 。 我們使用流暢的界面樣式,并在構(gòu)建ConservativePerson對(duì)象時(shí)利用現(xiàn)代IDE的功能來(lái)創(chuàng)建類似向?qū)У母杏X。 我們知道,我們知道,不要再談?wù)摿?#xff0c;并向我們展示代碼……但是在展示向?qū)Тa之前,我們將向您展示其用法,以便您了解我們?cè)谡f(shuō)什么……
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(); } } 現(xiàn)在,它看起來(lái)像一個(gè)普通的流暢接口,但是這里很酷的事情是,只有在當(dāng)前對(duì)象狀態(tài)允許的情況下,方法才可以調(diào)用。 你將不能夠調(diào)用的方法andNotVirgin這意味著如果你有沒有調(diào)用的方法whichIsMarried。
請(qǐng)參見以下屏幕截圖:
在我們聲明他已結(jié)婚之后,我們可以:
這是向?qū)Тa。 我敦促您將其復(fù)制/粘貼到您的IDE中,并嘗試使用它構(gòu)建一個(gè)對(duì)象。
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(); } } }如您所見,向?qū)О瑤讉€(gè)步驟。 每個(gè)步驟都由專用的內(nèi)部類表示。 每個(gè)步驟都通過(guò)其方法揭示了合法的可用操作。 然后,每種方法都會(huì)根據(jù)所做的更改返回一個(gè)新步驟。 這樣,將在編譯時(shí)而不是運(yùn)行時(shí)檢測(cè)創(chuàng)建非法對(duì)象的嘗試。
我們的生產(chǎn)代碼中實(shí)際上使用了這種模式。 我想到的一個(gè)示例是MediaJob類。 此類描述對(duì)某些媒體文件的操作。 為了將作業(yè)提交給系統(tǒng),必須創(chuàng)建一個(gè)MediaJob對(duì)象。 問(wèn)題在于,該對(duì)象具有許多參數(shù),這些參數(shù)可以分配與創(chuàng)建非法對(duì)象狀態(tài)的矛盾值。 通過(guò)使用向?qū)J?#xff0c;可以輕松構(gòu)建合法的工作,而無(wú)需了解整個(gè)(復(fù)雜的)約束集。
到此為止。 希望您能嘗試一下。..我們計(jì)劃在不久的將來(lái)對(duì)此進(jìn)行更正式的描述(GOF風(fēng)格)。
參考: DeveloperLife上我們JCG合作伙伴 Nadav Azaria和Roi Gamliel 的向?qū)гO(shè)計(jì)模式
翻譯自: https://www.javacodegeeks.com/2012/01/wizard-design-pattern.html
總結(jié)
- 上一篇: 图形教程
- 下一篇: FXML:使用BuilderFactor