向导页设计_向导设计模式

向导页设计

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

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

向导页设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java第十天

线程间通讯&#xff1a; 多个线程在处理同一资源&#xff0c;但是任务却不同。 多生产者&#xff0c;多消费者的问题&#xff1a; if判断标记&#xff0c;只有一次&#xff0c;会导致不该运行的线程运行了。出现了数据错误的情况。 while判断标记&#xff0c;解决了线程获取执行…

使用Apache Drill深入研究当今的大数据

自2014年9月首次提供Beta版以来&#xff0c; Apache Drill一直在获得广泛的用户采用和社区动力。2015年5月发布了Drill的通用版本-Drill 1.0&#xff0c;此后&#xff0c;许多客户已在生产中部署和使用了Drill。 在此博客文章中&#xff0c;我将简要总结客户在Drill中发现的宝贵…

mysql grep 提取错误日志_详解grep获取MySQL错误日志信息的方法

为方便维护MySQL&#xff0c;写了个脚本用以提供收集错误信息的接口。这些错误信息来自与MySQL错误日志&#xff0c;而 通过grep mysql可以获取error-log的路径。以下是全部相关代码&#xff1a;#!/usr/bin/env python2.7#-*- encoding: utf-8 -*-"""该模块用于…

微信小程序需要https后台的创业机会思考

最近比较关注微信小程序&#xff0c;而且微信小程序的后台必须强制要求https&#xff0c; https相对http成本要高很多了。 这里我感觉有2个商机 &#xff08;1&#xff09;提供https 中转服务器 ,按流量来收费 &#xff08;2&#xff09; 微信小程序https 云后台 对于很多人学…

aspx是什么语言_什么是网页

第一个问题&#xff0c;什么是网页&#xff1f;我们通常在网上浏览的所有网页都是网页&#xff0c;一个网站由一页到50页不等的网页组成&#xff0c;一些大型网站可能包含数千万页&#xff0c;是第一个打开网站的网站。这些页面被称为主页。专有名词:这里简要介绍网页、网站和主…

[Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建

一、前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程。该工程是基于nodejs和redis写成的一个简单的工程。针对nodejs和redis会在后面介绍。 It is a Node.js* application written using Express* (https://github.com/stro…

将Lucene搜索集成到应用程序中

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中&#xff0c;以…

mysql运算结果放入表中_MySQL表1新增数据,计算开始、结束日期之间所有时间,插入到表2中...

新建表c3#id设置自增量&#xff0c;kk是要同步的一些数据值&#xff0c;dd是开始时间&#xff0c;dde是结束时间CREATE TABLE c3 (id int(11) NOT NULL auto_increment PRIMARY KEY,kk varchar(255),dd datetime,dde datetime)新建表c4#id也设置自增量&#xff0c;kk是要同步…

git-svn — 让git和svn协同工作

git-svn — 让git和svn协同工作svn作为一个优秀源码版本的管理工具&#xff0c;可以适合绝大多数项目。但是因为它的采用中心化管理&#xff0c;不可避免的存在本地代码的备份和版本管理问题。也就是说对于尚未或暂无法提交到Subversion服务器的本地代码来说&#xff0c;存在着…

longtext长度为0是什么意思_为什么 HashMap 中链表长度大于 8 才转化为红黑树?

Java 中的 HashMap 采用链表法来解决哈希冲突&#xff08;HashMap 原理&#xff09;&#xff0c;即具有相同桶下标的键值对使用一个链表储存。当链表变长时&#xff0c;查找和添加&#xff08;需要确定 key 是否已经存在&#xff09;都需要遍历这个链表&#xff0c;速度会变慢。…

Ulink2 No Ulink Device found 解决办法

一、背景keil使用ULINK2调试的时候&#xff0c;提示"No Ulink Device found"&#xff0c;"error: flash download failed - Target DLL has cancelled" 。之前一直都OK&#xff0c;然后今天突然不行&#xff0c;插上的时候&#xff0c;"COM",&qu…

python图形界面教程_图形教程

python图形界面教程众所周知&#xff0c;我们可以借助Java库制作游戏&#xff0c;这些库为我们提供制作游戏所需的图形。 因此&#xff0c;今天我将开始一个关于Java图形的非常新的部分。 我之前曾发表过有关如何制作所得税计算器的文章 。 首先要满足一些先决条件&#xff1a;…

java创建树结构_Java学习之XML-017

如果想快速有效的学习&#xff0c;思想核心是“以建立知识体系为核心”&#xff0c;具体方法是“守破离”。反复练习直到熟练。————百战程序员1.0 XML1.1 XML 简介XML 指可扩展标记语言。XML 被设计用来传输和存储数据。1. 什么是XMLXML 指可扩展标记语言&#xff08;EXten…

dll文件是什么

dll实际上是动态链接库的缩写&#xff0c;从windows1.0开始&#xff0c;动态链接库就是整个操作系统的基础&#xff0c;那么这有什么作用呢&#xff1f;在dos时代&#xff0c;程序员是通过编写程序来达到预期的目的的&#xff0c;每实现一个目的就需要编写一个程序&#xff0c;…

minecraft pythonapl_Substance PythonAPI入门案例

第一次在知乎发文&#xff0c;技术朋友们请多包涵。Substance Designer自去年夏天2018版推出Python API至今已有一年&#xff0c;从一开始的寒酸到现在的初成规模&#xff0c;官方的API库也随着版本的更新不断完善。目前网上(包括youtube)相关的教程甚少&#xff0c;即便是官方…

创建示例HTTPS服务器以获取乐趣和收益

通常&#xff0c;在开发人员或/和针对实际场景进行测试期间&#xff0c;我们&#xff08;开发人员&#xff09;面临着运行成熟的HTTPS服务器的需求&#xff0c;可能同时进行一些模拟。 在JVM平台上&#xff0c;除非您知道适合此工作的正确工具&#xff0c;否则它过去并不是一件…

WebDriver API元素的定位

一、以下截图为用FireBug定位的用火狐(Firefox)浏览器打开的百度首页&#xff0c;下面所讲述的八种定位方法&#xff0c;就是以该截图中的百度输入框为例子。 ①、FireBug是Firefox浏览器下的开发类插件&#xff0c;通过该插件可以查看HTML、CSS、Javascript控制台、网络状况监…

mysql字符乱码百度_如何解决MySQL字符集乱码问题

变量 a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的&#xff0c;假设此时编码为 A&#xff0c;也就是变量 a 的编码。2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定&#xff0c;假设此时编码为 B。3. 经过 MySQL 一系列词法&#xff0c;语…

[水煮 ASP.NET Web API2 方法论](1-6)Model Validation

问题 想要 ASP.NET Web API 执行模型验证&#xff0c;同时可以和 ASP.NET MVC 共享一些验证逻辑。 解决方案 ASP.NET Web API 与 ASP.NET MVC 支持一样的验证机制&#xff0c;都是通过System.ComponentModel.DataAnnoataions 的属性验证。使用框架提供的相关验证属性&#xff0…

findbugs-dea_FindBugs和JSR-305

findbugs-dea假设该组开发人员在大型项目的各个部分上并行工作-一些开发人员在进行服务实现&#xff0c;而其他开发人员在使用该服务的代码。 考虑到API的假设&#xff0c;两个小组都同意服务API&#xff0c;并开始单独工作。 您认为这个故事会有幸福的结局吗&#xff1f; 好吧…