向导页设计

我们都喜欢巫师……。 (我的意思是软件向导)。 我们总是很高兴跳到那些“下一步”按钮上,就像我们在我们的时髦的小鸡上跳舞一样。。。 因此,今天我们将您心爱的向导带入您的编码体验。 让我们跳入一个例子。

假设您要设计一个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; }
}

因此,它具有一些约束。

  • 他必须结婚,然后才能...好吧,不是处女。
  • 据我们所知,在生孩子之前他不能是处女。

在过去,直到今天基本上都是过去……,您可能会为此类定义各种修饰符方法,这些修饰符方法会在不变无效的情况下引发异常,例如NotMarriedExceptionVirginException 。 不再。

今天,我们将使用向导设计模式来完成此操作 。 在构建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

向导页设计

向导页设计_向导设计模式相关推荐

  1. C#语言实现的向导页设计

    2019独角兽企业重金招聘Python工程师标准>>> 本文的主要写了C#实现向导页的设计方法与注意事项 一.准备工作 第一步,建立一个Windows窗体应用程序,取名GuideTe ...

  2. HTML5期末大作业:医药用品购物网站设计——医药用品购物商城首页(1页) HTML+CSS+JavaScript HTML+CSS大作业_ 医药用品购物网页制作作业_医药用品购物页设计...

    HTML5期末大作业:医药用品购物网站设计--医药用品购物商城首页(1页) HTML+CSS+JavaScript HTML+CSS大作业: 医药用品购物网页制作作业_医药用品购物页设计- 常见网页设 ...

  3. 地图旋转_折纸效果三维旋转,不一样的地图页设计

    我们在制作PPT或网页的过程中,有时候会用到地图来标记地点信息. 比如这样 ▲图片来自腾讯云官网 或者是这样 ▲图片来自全球敏捷运维峰会官网 今天就来给大家介绍一种地图页面的新玩法:三维折纸地图. 听 ...

  4. wordvba编程代码大全_面向对象、设计原则、设计模式、编程规范、重构

    面向对象.设计原则.设计模式.编程规范.重构 面向对象 主流的三个编程风格有:面向对象,面向过程,函数式编程. 面向对象是最主流的风格,面向对象具有丰富的特性(封装,抽象,继承,多态). 面向对象 面 ...

  5. mysql的设计模式_数据库设计中使用设计模式

    一.引言 现代的企业开发中,越来越多地引入了多层架构设计模式,即使是小型的企业信息系统也逐渐向多层架构发展,以满足系统的可伸缩性以及可维护性.目前企业开发的平台占主导地位的是 J2EE 和 .NET ...

  6. c语言课程设计坦克大战,funcodec++课程设计_坦克大战

    <funcodec++课程设计_坦克大战>由会员分享,可在线阅读,更多相关<funcodec++课程设计_坦克大战(24页珍藏版)>请在人人文库网上搜索. 1.课程设计一 坦克 ...

  7. 反馈页面设计_获得设计反馈的艺术

    反馈页面设计 I'm going to assume that you already know the importance of sharing work early and often to g ...

  8. figma设计_如何在Figma中构建设计入门套件(第二部分)

    figma设计 Figma教程 (Figma Tutorial) With this short, but informative Tutorial Series I aim to show you ...

  9. qq空间网页设计_网页设计中负空间的有效利用

    qq空间网页设计 Written by Alan Smith 由艾伦·史密斯 ( Alan Smith)撰写 Negative space is a key design element that y ...

最新文章

  1. 使用zerotier让异地设备组局域网
  2. mysql 视图 临时表模式
  3. 字节流写数据的两个小问题
  4. 用 C# 写一个 Redis 数据同步小工具
  5. java merge css_一句命令快速合并 JS、CSS
  6. linux tomcat8 启动慢,Linux系统下Tomcat8启动速度很慢的解决方法
  7. linux入门_Linux超详细0基础入门篇(一)
  8. decimal类型对象里面定义什么类型_奥斯塔罗 单身开启桃花雷达 现阶段的我适合什么类型的对象?...
  9. 手绘平面设计邮票插画素材,复古元素走起
  10. 什么是Web渗透测试
  11. ServerVariables 变量
  12. Photoshop编辑GIF
  13. jQuery源码分析(一)
  14. 山寨版学子商城——成功上线!
  15. 运维项目经验示例(参考)
  16. 关于机器人运动学与动力学建模的几点领悟
  17. 装机之必备软件下载合集
  18. 利用css制作3D按钮
  19. 《加速器理论(第二版)》读书笔记
  20. android+6+wifi密码,Android 如何查看Wifi密码

热门文章

  1. 漫画:什么是单例设计模式
  2. 漫画:什么是一致性哈希
  3. forEach和for in
  4. 你知道i=i++;的含义吗?原理其实没有你想的那么简单
  5. java人脸识别更新:摄像头支持360、火狐和谷歌浏览器
  6. JavaScript ECMA
  7. break VS continue
  8. java弹弹球实验报告_Java弹球游戏实验报告—chen
  9. antd vue表单上传文件_vue+axios+antD的上传图片踩坑
  10. 在 eclipse 中 设置 jvm 的 运行时目录