向导页设计_向导设计模式
向导页设计
假设您要设计一个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
向导页设计
向导页设计_向导设计模式相关推荐
- C#语言实现的向导页设计
2019独角兽企业重金招聘Python工程师标准>>> 本文的主要写了C#实现向导页的设计方法与注意事项 一.准备工作 第一步,建立一个Windows窗体应用程序,取名GuideTe ...
- HTML5期末大作业:医药用品购物网站设计——医药用品购物商城首页(1页) HTML+CSS+JavaScript HTML+CSS大作业_ 医药用品购物网页制作作业_医药用品购物页设计...
HTML5期末大作业:医药用品购物网站设计--医药用品购物商城首页(1页) HTML+CSS+JavaScript HTML+CSS大作业: 医药用品购物网页制作作业_医药用品购物页设计- 常见网页设 ...
- 地图旋转_折纸效果三维旋转,不一样的地图页设计
我们在制作PPT或网页的过程中,有时候会用到地图来标记地点信息. 比如这样 ▲图片来自腾讯云官网 或者是这样 ▲图片来自全球敏捷运维峰会官网 今天就来给大家介绍一种地图页面的新玩法:三维折纸地图. 听 ...
- wordvba编程代码大全_面向对象、设计原则、设计模式、编程规范、重构
面向对象.设计原则.设计模式.编程规范.重构 面向对象 主流的三个编程风格有:面向对象,面向过程,函数式编程. 面向对象是最主流的风格,面向对象具有丰富的特性(封装,抽象,继承,多态). 面向对象 面 ...
- mysql的设计模式_数据库设计中使用设计模式
一.引言 现代的企业开发中,越来越多地引入了多层架构设计模式,即使是小型的企业信息系统也逐渐向多层架构发展,以满足系统的可伸缩性以及可维护性.目前企业开发的平台占主导地位的是 J2EE 和 .NET ...
- c语言课程设计坦克大战,funcodec++课程设计_坦克大战
<funcodec++课程设计_坦克大战>由会员分享,可在线阅读,更多相关<funcodec++课程设计_坦克大战(24页珍藏版)>请在人人文库网上搜索. 1.课程设计一 坦克 ...
- 反馈页面设计_获得设计反馈的艺术
反馈页面设计 I'm going to assume that you already know the importance of sharing work early and often to g ...
- figma设计_如何在Figma中构建设计入门套件(第二部分)
figma设计 Figma教程 (Figma Tutorial) With this short, but informative Tutorial Series I aim to show you ...
- qq空间网页设计_网页设计中负空间的有效利用
qq空间网页设计 Written by Alan Smith 由艾伦·史密斯 ( Alan Smith)撰写 Negative space is a key design element that y ...
最新文章
- 使用zerotier让异地设备组局域网
- mysql 视图 临时表模式
- 字节流写数据的两个小问题
- 用 C# 写一个 Redis 数据同步小工具
- java merge css_一句命令快速合并 JS、CSS
- linux tomcat8 启动慢,Linux系统下Tomcat8启动速度很慢的解决方法
- linux入门_Linux超详细0基础入门篇(一)
- decimal类型对象里面定义什么类型_奥斯塔罗 单身开启桃花雷达 现阶段的我适合什么类型的对象?...
- 手绘平面设计邮票插画素材,复古元素走起
- 什么是Web渗透测试
- ServerVariables 变量
- Photoshop编辑GIF
- jQuery源码分析(一)
- 山寨版学子商城——成功上线!
- 运维项目经验示例(参考)
- 关于机器人运动学与动力学建模的几点领悟
- 装机之必备软件下载合集
- 利用css制作3D按钮
- 《加速器理论(第二版)》读书笔记
- android+6+wifi密码,Android 如何查看Wifi密码