当前位置: 首页 > news >正文

旅游网站建设最重要的流程织梦做网站

旅游网站建设最重要的流程,织梦做网站,网站后台路径,用织梦做的网站好用吗文章目录 一、定义#xff1a;状态模式二、模拟场景#xff1a;状态模式2.1 状态模式2.2 引入依赖2.3 工程结构2.4 模拟审核状态流转2.4.1 活动状态枚举2.4.2 活动信息类2.4.3 活动服务接口2.4.4 返回结果类 三、违背方案#xff1a;状态模式3.0 引入依赖3.1 工程结构3.2 活… 文章目录 一、定义状态模式二、模拟场景状态模式2.1 状态模式2.2 引入依赖2.3 工程结构2.4 模拟审核状态流转2.4.1 活动状态枚举2.4.2 活动信息类2.4.3 活动服务接口2.4.4 返回结果类 三、违背方案状态模式3.0 引入依赖3.1 工程结构3.2 活动执行状态变更控制层3.3 单元测试 四、改善代码状态模式4.0 引入依赖4.1 工程结构4.2 状态模式结构图4.3 活动状态变更流程4.3.1 定义状态抽象类4.3.2 待审核状态流转实现4.3.3 活动关闭状态流转实现4.3.4 活动中状态流转实现4.3.5 编辑中状态流转实现4.3.6 活动开启状态流转实现4.3.7 审核通过状态流转实现4.3.8 审核拒绝状态流转实现4.3.9 活动执行者 4.4 单元测试4.4.1 编辑中到提审活动测试验证4.4.2 编辑中到开启活动测试验证4.4.3 审批拒绝到活动中测试验证4.4.4 审批拒绝到撤审测试验证 五、总结状态模式 一、定义状态模式 **状态模式**是一个行为下的多种状态变更。 比如我们常见的一个网站的页面在你登录与不登录下展示的内容是略有差异的 (不登录不能展示个人信息)。这种 登录 与 不登录 就是我们通过改变 状态而让整个行为发生了变化。 状态模式的使用场景。例如磁带放音机。 它的上面是一排按钮当放入磁带后通过上面的按钮就可以让放音机播放磁带上的内容。而且有些按钮是互斥的当在某个状态下才可以按另外的按钮这在设计模式里也是一个关键的点 。 二、模拟场景状态模式 2.1 状态模式 模拟营销活动审核状态流转场景(一个活动的上线是多个层级审核上线的)。在上图中可以看到我们的流程节点中包括了各个状态到下一个状态扭转的关联条件。 比如审核通过才能到活动中而不能从编辑中直接到活动中而这些状态的转变就是我们要完成的场景处理。 我们都开发过类似的业务场景需要对活动或者一些配置需要审核后才能对外发布而这个审核的过程往往会随着系统的重要程序而设立多级控制来保证一个活动可以安全上线避免造成资损。当然有时候会用到一些审批流的过程配置也是非常方便开发类似的流程的也可以在配置中设定某个节点的审批人员。在本案例中们我主要是模拟学习对一个活动的多个状态节点的审核控制。 2.2 引入依赖 pom.xml dependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.62/version/dependency!-- LOGGING begin --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.5/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdjcl-over-slf4j/artifactIdversion1.7.5/version/dependencydependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.0.9/versionexclusionsexclusionartifactIdslf4j-api/artifactIdgroupIdorg.slf4j/groupId/exclusion/exclusions/dependency /dependencies2.3 工程结构 design-20.0-0 |——src|——main|--java|--com.lino.design|-ActicityInfo.java|-ActivityService.java|-Result.java|-Status.java2.4 模拟审核状态流转 2.4.1 活动状态枚举 Status.java package com.lino.design;/*** description: 状态枚举*/ public enum Status {/*** 1.创建编辑2.待审核3.审核通过(任务扫描成活动中)* 4.审核拒绝(可以撤审到编辑状态)5.活动中* 6.活动关闭7.活动开启(任务扫描成活动中)*/Editing, Check, Pass, Refuse, Doing, Close, Open }2.4.2 活动信息类 ActicityInfo.java package com.lino.design;import java.util.Date; import java.util.Map;/*** description: 活动类*/ public class ActicityInfo {/*** 活动ID*/private String acticityId;/*** 活动名称*/private String acticityName;/*** 活动状态*/private EnumStatus status;/*** 开始时间*/private Date beginTime;/*** 结束时间*/private Date endTime;public String getActicityId() {return acticityId;}public void setActicityId(String acticityId) {this.acticityId acticityId;}public String getActicityName() {return acticityName;}public void setActicityName(String acticityName) {this.acticityName acticityName;}public EnumStatus getStatus() {return status;}public void setStatus(EnumStatus status) {this.status status;}public Date getBeginTime() {return beginTime;}public void setBeginTime(Date beginTime) {this.beginTime beginTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime endTime;} }基本的活动信息活动ID、活动名称、活动状态、开始时间、结束时间 2.4.3 活动服务接口 ActivityService.java package com.lino.design;import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;/*** description: 活动服务类*/ public class ActivityService {private static MapString, EnumStatus statusMap new ConcurrentHashMap();/*** 初始化活动** param activityId 活动ID* param status 活动状态*/public static void init(String activityId, EnumStatus status) {// 模拟查询活动信息ActicityInfo acticityInfo new ActicityInfo();acticityInfo.setActicityId(activityId);acticityInfo.setActicityName(早起学习打卡领奖活动);acticityInfo.setStatus(status);acticityInfo.setBeginTime(new Date());acticityInfo.setEndTime(new Date());statusMap.put(activityId, status);}/*** 查询活动信息** param activityId 活动ID* return 活动信息*/public static ActicityInfo queryActivityInfo(String activityId) {// 模拟查询活动信息ActicityInfo acticityInfo new ActicityInfo();acticityInfo.setActicityId(activityId);acticityInfo.setActicityName(早起学习打卡领奖活动);acticityInfo.setStatus(statusMap.get(activityId));acticityInfo.setBeginTime(new Date());acticityInfo.setEndTime(new Date());return acticityInfo;}/*** 查询活动状态** param activityId 活动ID* return 活动状态*/public static EnumStatus queryActivityStatus(String activityId) {return statusMap.get(activityId);}/*** 执行状态变更** param activityId 活动ID* param beforeStatus 变更前状态* param afterStatus 变更后状态*/public static synchronized void execStatus(String activityId, EnumStatus beforeStatus, EnumStatus afterStatus) {if (!beforeStatus.equals(statusMap.get(activityId))) {return;}statusMap.put(activityId, afterStatus);} }在这个静态类中提供了活动的查询和状态变更接口。 queryActivityInfo 查询活动信息。queryActivityStatus 查询活动状态。execStatus执行状态变更。 同时使用 Map 的结构来记录活动ID 和状态变化信息另外还有 init 方法来初始化活动数据。 实际的开发中这类信息基本都是从 数据库 或者 Redis 中获取。 2.4.4 返回结果类 Result.java package com.lino.design;/*** description: 结果类*/ public class Result {/*** 编码*/private String code;/*** 描述*/private String info;public Result(String code, String info) {this.code code;this.info info;}public String getCode() {return code;}public void setCode(String code) {this.code code;}public String getInfo() {return info;}public void setInfo(String info) {this.info info;} }三、违背方案状态模式 对于这样各种状态的变更最让我们直接想到的就是使用 if 和 else 进行判断处理。 每一个状态可以流转到下一个什么状态都可以使用嵌套的 if 实现。 3.0 引入依赖 dependenciesdependencygroupIdcom.lino/groupIdartifactIddesign-20.0-0/artifactIdversion1.0-SNAPSHOT/version/dependency /dependencies3.1 工程结构 design-20.0-1 |——src|——main|--java|--com.lino.design|-ActivityExecStatusController.java|--test|--com.lino.design.test|-ApiTest.java3.2 活动执行状态变更控制层 ActivityExecStatusController.java package com.lino.design;/*** description: 活动状态变更控制层*/ public class ActivityExecStatusController {/*** 活动状态变更* 1. 编辑中 - 提审、关闭* 2. 审核通过 - 拒绝、关闭、活动中* 3. 审核拒绝 - 撤审、关闭* 4. 活动中 - 关闭* 5. 活动关闭 - 开启* 6. 活动开启 - 关闭** param activityId 活动ID* param beforeStatus 变更前状态* param afterStatus 变更后状态* return 返回结果*/public Result execStatus(String activityId, EnumStatus beforeStatus, EnumStatus afterStatus) {// 1. 编辑中 - 提审、关闭if (Status.Editing.equals(beforeStatus)) {if (Status.Check.equals(afterStatus) || Status.Close.equals(afterStatus)) {ActivityService.execStatus(activityId, beforeStatus, afterStatus);return new Result(0000, 变更状态成功);} else {return new Result(0001, 变更状态拒绝);}}// 2. 审核通过 - 拒绝、关闭、活动中if (Status.Pass.equals(beforeStatus)) {if (Status.Refuse.equals(afterStatus) || Status.Doing.equals(afterStatus) || Status.Close.equals(afterStatus)) {ActivityService.execStatus(activityId, beforeStatus, afterStatus);return new Result(0000, 变更状态成功);} else {return new Result(0001, 变更状态拒绝);}}// 3. 审核拒绝 - 撤审、关闭if (Status.Refuse.equals(beforeStatus)) {if (Status.Editing.equals(afterStatus) || Status.Close.equals(afterStatus)) {ActivityService.execStatus(activityId, beforeStatus, afterStatus);return new Result(0000, 变更状态成功);} else {return new Result(0001, 变更状态拒绝);}}// 4. 活动中 - 关闭if (Status.Doing.equals(beforeStatus)) {if (Status.Close.equals(afterStatus)) {ActivityService.execStatus(activityId, beforeStatus, afterStatus);return new Result(0000, 变更状态成功);} else {return new Result(0001, 变更状态拒绝);}}// 5. 活动关闭 - 开启if (Status.Close.equals(beforeStatus)) {if (Status.Open.equals(afterStatus)) {ActivityService.execStatus(activityId, beforeStatus, afterStatus);return new Result(0000, 变更状态成功);} else {return new Result(0001, 变更状态拒绝);}}// 6. 活动开启 - 关闭if (Status.Open.equals(beforeStatus)) {if (Status.Close.equals(afterStatus)) {ActivityService.execStatus(activityId, beforeStatus, afterStatus);return new Result(0000, 变更状态成功);} else {return new Result(0001, 变更状态拒绝);}}return new Result(0001, 非可处理的活动状态变更);} }从这个代码实现的结构看从上到下是一整篇的 if-else 。这样的面向过程式开发方式对于不需要改动代码也不需要二次迭代的还是可以使用的(但基本不可能不迭代)。而且随着状态和需求变化会越来越难为维护后面的人也不好看懂并且很容易填充其他的流程进去。 3.3 单元测试 ApiTest.java package com.lino.design.test;import com.alibaba.fastjson.JSON; import com.lino.design.ActivityExecStatusController; import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.Status; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory;/*** description: 单元测试*/ public class ApiTest {private Logger logger LoggerFactory.getLogger(ApiTest.class);Testpublic void test() {// 初始化数据String activityId 100001;ActivityService.init(activityId, Status.Editing);ActivityExecStatusController activityExecStatusController new ActivityExecStatusController();Result resultRefuse activityExecStatusController.execStatus(activityId, Status.Editing, Status.Refuse);logger.info(测试结果(编辑中To审核拒绝){}, JSON.toJSONString(resultRefuse));Result resultCheck activityExecStatusController.execStatus(activityId, Status.Editing, Status.Check);logger.info(测试结果(编辑中To提交审核){}, JSON.toJSONString(resultCheck));} }这个测试主要包括两个功能的验证一个是从 编辑中 到 审核拒绝 另外一个是从 编辑中 到 提交审核 。因为从我们的场景流程中可以看到编辑中 的活动是不能直接到 审核拒绝 这中间还需要 提审 。 测试结果 17:03:34.528 [main] INFO com.lino.design.test.ApiTest - 测试结果(编辑中To审核拒绝){code:0001,info:变更状态拒绝} 17:03:34.534 [main] INFO com.lino.design.test.ApiTest - 测试结果(编辑中To提交审核){code:0000,info:变更状态成功}四、改善代码状态模式 重构的重点往往是处理掉 if-else 而想处理掉 if-else 基本离不开接口与抽象类另外还需要重新改造代码结构。 4.0 引入依赖 dependenciesdependencygroupIdcom.lino/groupIdartifactIddesign-20.0-0/artifactIdversion1.0-SNAPSHOT/version/dependency /dependencies4.1 工程结构 design-19.0-2 |——src|——main|--java|--com.lino.design|--impl| |--CheckState.java| |--CloseState.java| |--DoingState.java| |--EditingState.java| |--OpenState.java| |--PassState.java| |--RefuseState.java|-State.java|-StateHandler.java|--test|--com.lino.design.test|-ApiTest.java4.2 状态模式结构图 以上是状态模式的整个工程结构模型State 是一个抽象类定义了各种操作接口(提审、审核、拒审等)。右侧的不同颜色状态与我们场景模拟中的颜色保持一致是各种状态流程流转的实现操作。 这里的实现有一个关键点就是每一种状态到下一个状态都分配到各个实现方法中控制也就不需要 if 语言进行判断了。 最后是 StateHandler对状态流程的统一处理里面提供 Map 结构的各项服务接口调用也就避免了使用 if 判断各项状态转变的流程。 4.3 活动状态变更流程 4.3.1 定义状态抽象类 State.java package com.lino.design;/*** description: 活动状态抽象类*/ public abstract class State {/*** 活动提审** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public abstract Result arraignment(String activityId, EnumStatus currentStatus);/*** 审核通过** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public abstract Result checkPass(String activityId, EnumStatus currentStatus);/*** 审核拒绝** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public abstract Result checkRefuse(String activityId, EnumStatus currentStatus);/*** 撤审撤销** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public abstract Result checkRevoke(String activityId, EnumStatus currentStatus);/*** 活动关闭** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public abstract Result close(String activityId, EnumStatus currentStatus);/*** 活动开启** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public abstract Result open(String activityId, EnumStatus currentStatus);/*** 活动执行** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public abstract Result doing(String activityId, EnumStatus currentStatus); }整个接口中提供了各项状态流转服务的接口例如活动提审、审核通过 、审核拒绝 、撤审撤销 、活动关闭 、活动开启 、**活动执行 。在这些方法中所有的入参都是一样的activityId (活动ID)、currentStatus (当前状态)只有他们的具体实现是不同的。 4.3.2 待审核状态流转实现 CheckState.java package com.lino.design.impl;import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.State; import com.lino.design.Status;/*** description: 待审核*/ public class CheckState extends State {Overridepublic Result arraignment(String activityId, EnumStatus currentStatus) {return new Result(0001, 待审核状态不可重复提审);}Overridepublic Result checkPass(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Pass);return new Result(0000, 活动审核通过完成);}Overridepublic Result checkRefuse(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Refuse);return new Result(0000, 活动审核拒绝完成);}Overridepublic Result checkRevoke(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Editing);return new Result(0000, 活动审核撤销回到编辑中);}Overridepublic Result close(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Close);return new Result(0000, 活动审核关闭完成);}Overridepublic Result open(String activityId, EnumStatus currentStatus) {return new Result(0001, 非关闭活动不可开启);}Overridepublic Result doing(String activityId, EnumStatus currentStatus) {return new Result(0001, 待审核活动不可执行活动中变更);} }4.3.3 活动关闭状态流转实现 CloseState.java package com.lino.design.impl;import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.State; import com.lino.design.Status;/*** description: 活动关闭*/ public class CloseState extends State {Overridepublic Result arraignment(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动关闭不可提审);}Overridepublic Result checkPass(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动关闭不可审核通过);}Overridepublic Result checkRefuse(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动关闭不可审核拒绝);}Overridepublic Result checkRevoke(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动关闭不可撤销审核);}Overridepublic Result close(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动关闭不可重复关闭);}Overridepublic Result open(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Open);return new Result(0000, 活动开启完成);}Overridepublic Result doing(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动关闭不可变更活动中);} }4.3.4 活动中状态流转实现 DoingState.java package com.lino.design.impl;import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.State; import com.lino.design.Status;/*** description: 活动中*/ public class DoingState extends State {Overridepublic Result arraignment(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动中不可提审);}Overridepublic Result checkPass(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动中不可审核通过);}Overridepublic Result checkRefuse(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动中不可审核拒绝);}Overridepublic Result checkRevoke(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动中不可撤销审核);}Overridepublic Result close(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Close);return new Result(0000, 活动关闭完成);}Overridepublic Result open(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动中不可开启);}Overridepublic Result doing(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动中不可重复执行);} }4.3.5 编辑中状态流转实现 EditingState.java package com.lino.design.impl;import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.State; import com.lino.design.Status;/*** description: 编辑中*/ public class EditingState extends State {Overridepublic Result arraignment(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Check);return new Result(0000, 活动提审成功);}Overridepublic Result checkPass(String activityId, EnumStatus currentStatus) {return new Result(0001, 编辑中不可审核通过);}Overridepublic Result checkRefuse(String activityId, EnumStatus currentStatus) {return new Result(0001, 编辑中不可审核拒绝);}Overridepublic Result checkRevoke(String activityId, EnumStatus currentStatus) {return new Result(0001, 编辑中不可撤销审核);}Overridepublic Result close(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Close);return new Result(0000, 活动关闭完成);}Overridepublic Result open(String activityId, EnumStatus currentStatus) {return new Result(0001, 非关闭活动不可开启);}Overridepublic Result doing(String activityId, EnumStatus currentStatus) {return new Result(0001, 编辑活动中不可执行活动中变更);} }4.3.6 活动开启状态流转实现 OpenState.java package com.lino.design.impl;import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.State; import com.lino.design.Status;/*** description: 活动开启*/ public class OpenState extends State {Overridepublic Result arraignment(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动开启不可提审);}Overridepublic Result checkPass(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动开启不可审核通过);}Overridepublic Result checkRefuse(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动开启不可审核拒绝);}Overridepublic Result checkRevoke(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动开启不可撤销审核);}Overridepublic Result close(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Close);return new Result(0000, 活动关闭完成);}Overridepublic Result open(String activityId, EnumStatus currentStatus) {return new Result(0001, 活动不可重复开启);}Overridepublic Result doing(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Doing);return new Result(0000, 活动变更活动中完成);} }4.3.7 审核通过状态流转实现 PassState.java package com.lino.design.impl;import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.State; import com.lino.design.Status;/*** description: 审核通过*/ public class PassState extends State {Overridepublic Result arraignment(String activityId, EnumStatus currentStatus) {return new Result(0001, 已审核状态不可重复提审);}Overridepublic Result checkPass(String activityId, EnumStatus currentStatus) {return new Result(0001, 已审核状态不可重复审核);}Overridepublic Result checkRefuse(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Refuse);return new Result(0000, 活动审核拒绝完成);}Overridepublic Result checkRevoke(String activityId, EnumStatus currentStatus) {return new Result(0001, 审核通过不可撤销(可先拒绝审核));}Overridepublic Result close(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Close);return new Result(0000, 活动关闭完成);}Overridepublic Result open(String activityId, EnumStatus currentStatus) {return new Result(0001, 非关闭活动不可开启);}Overridepublic Result doing(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Doing);return new Result(0000, 活动变更活动中完成);} }4.3.8 审核拒绝状态流转实现 RefuseState.java package com.lino.design.impl;import com.lino.design.ActivityService; import com.lino.design.Result; import com.lino.design.State; import com.lino.design.Status;/*** description: 审核拒绝*/ public class RefuseState extends State {Overridepublic Result arraignment(String activityId, EnumStatus currentStatus) {return new Result(0001, 已审核状态不可重复提审);}Overridepublic Result checkPass(String activityId, EnumStatus currentStatus) {return new Result(0001, 已审核状态不可重复审核);}Overridepublic Result checkRefuse(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Refuse);return new Result(0000, 活动审核拒绝不可重复审核);}Overridepublic Result checkRevoke(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Editing);return new Result(0000, 撤销审核完成);}Overridepublic Result close(String activityId, EnumStatus currentStatus) {ActivityService.execStatus(activityId, currentStatus, Status.Close);return new Result(0000, 活动审核关闭完成);}Overridepublic Result open(String activityId, EnumStatus currentStatus) {return new Result(0001, 非关闭活动不可开启);}Overridepublic Result doing(String activityId, EnumStatus currentStatus) {return new Result(0001, 审核拒绝不可执行活动为进行中);} }这里提供了七个具体实现类。待审核、活动关闭 、活动中、编辑中、活动开启、审核通过、审核拒绝。在每个实现类中每个方法对于不同的类中有不同的实现也就是不同状态下一步流转操作已经可以在每一个方法中具体控制了。 4.3.9 活动执行者 StateHandler.java package com.lino.design;import com.lino.design.impl.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;/*** description: 活动执行者*/ public class StateHandler {private MapEnumStatus, State stateMap new ConcurrentHashMap();public StateHandler() {// 待审核stateMap.put(Status.Check, new CheckState());// 已关闭stateMap.put(Status.Close, new CloseState());// 活动中stateMap.put(Status.Doing, new DoingState());// 编辑中stateMap.put(Status.Editing, new EditingState());// 已开启stateMap.put(Status.Open, new OpenState());// 审核通过stateMap.put(Status.Pass, new PassState());// 审核拒绝stateMap.put(Status.Refuse, new RefuseState());}/*** 活动提审** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public Result arraignment(String activityId, EnumStatus currentStatus) {return stateMap.get(currentStatus).arraignment(activityId, currentStatus);}/*** 审核通过** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public Result checkPass(String activityId, EnumStatus currentStatus) {return stateMap.get(currentStatus).checkPass(activityId, currentStatus);}/*** 审核拒绝** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public Result checkRefuse(String activityId, EnumStatus currentStatus) {return stateMap.get(currentStatus).checkRefuse(activityId, currentStatus);}/*** 撤审撤销** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public Result checkRevoke(String activityId, EnumStatus currentStatus) {return stateMap.get(currentStatus).checkRevoke(activityId, currentStatus);}/*** 活动关闭** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public Result close(String activityId, EnumStatus currentStatus) {return stateMap.get(currentStatus).close(activityId, currentStatus);}/*** 活动开启** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public Result open(String activityId, EnumStatus currentStatus) {return stateMap.get(currentStatus).open(activityId, currentStatus);}/*** 活动执行** param activityId 活动ID* param currentStatus 当前状态* return 执行结果*/public Result doing(String activityId, EnumStatus currentStatus) {return stateMap.get(currentStatus).doing(activityId, currentStatus);} }这是对状态服务的统一控制中心可以看到子啊构造函数中提供了所有状态和实现的具体关联放到 Map 数据结构中。同时提供了不同名称的接口操作类让外部调用方可以更加容易的使用此项功能接口而不需要像在之前还得传两个状态来判断。 4.4 单元测试 4.4.1 编辑中到提审活动测试验证 ApiTest.java Test public void test_Editing2Arraignment() {String activityId 100001;ActivityService.init(activityId, Status.Editing);StateHandler stateHandler new StateHandler();Result result stateHandler.arraignment(activityId, Status.Editing);logger.info(测试结果(编辑中To提审活动){}, JSON.toJSONString(result));logger.info(活动信息{} 状态{}, JSON.toJSONString(ActivityService.queryActivityInfo(activityId)), JSON.toJSONString(ActivityService.queryActivityStatus(activityId))); }测试结果 20:48:10.752 [main] INFO com.lino.design.test.ApiTest - 测试结果(编辑中To提审活动){code:0000,info:活动提审成功} 20:48:10.788 [main] INFO com.lino.design.test.ApiTest - 活动信息{activityId:100001,activityName:早起学习打卡领奖活动,beginTime:1675860490764,endTime:1675860490764,status:Check} 状态Check从编辑中到提审活动到状态流转测试验证结果显示正常。 4.4.2 编辑中到开启活动测试验证 ApiTest.java Test public void test_Editing2Open() {String activityId 100001;ActivityService.init(activityId, Status.Editing);StateHandler stateHandler new StateHandler();Result result stateHandler.open(activityId, Status.Editing);logger.info(测试结果(编辑中To开启活动){}, JSON.toJSONString(result));logger.info(活动信息{} 状态{}, JSON.toJSONString(ActivityService.queryActivityInfo(activityId)), JSON.toJSONString(ActivityService.queryActivityStatus(activityId))); }测试结果 20:48:57.997 [main] INFO com.lino.design.test.ApiTest - 测试结果(编辑中To开启活动){code:0001,info:非关闭活动不可开启} 20:48:58.041 [main] INFO com.lino.design.test.ApiTest - 活动信息{activityId:100001,activityName:早起学习打卡领奖活动,beginTime:1675860538008,endTime:1675860538008,status:Editing} 状态Editing从编辑中到开启活动到状态流转可以看到测试结果是拒绝- 非关闭活动不可开启 。按照流程流转结果预期结果正常不能从编辑中直接到活动开启需要经过审批阶段。 4.4.3 审批拒绝到活动中测试验证 ApiTest.java Test public void test_Editing2Doing() {String activityId 100001;ActivityService.init(activityId, Status.Refuse);StateHandler stateHandler new StateHandler();Result result stateHandler.doing(activityId, Status.Refuse);logger.info(测试结果(拒绝To活动中){}, JSON.toJSONString(result));logger.info(活动信息{} 状态{}, JSON.toJSONString(ActivityService.queryActivityInfo(activityId)), JSON.toJSONString(ActivityService.queryActivityStatus(activityId))); }测试结果 20:49:51.974 [main] INFO com.lino.design.test.ApiTest - 测试结果(拒绝To活动中){code:0001,info:审核拒绝不可执行活动为进行中} 20:49:52.015 [main] INFO com.lino.design.test.ApiTest - 活动信息{activityId:100001,activityName:早起学习打卡领奖活动,beginTime:1675860591979,endTime:1675860591979,status:Refuse} 状态Refuse从审批拒绝到活动中到状态流转可以看到同样是拒绝- 审批拒绝不可执行活动中 为进行中满足预期。 4.4.4 审批拒绝到撤审测试验证 ApiTest.java Test public void test_Editing2Revoke() {String activityId 100001;ActivityService.init(activityId, Status.Refuse);StateHandler stateHandler new StateHandler();Result result stateHandler.checkRevoke(activityId, Status.Refuse);logger.info(测试结果(拒绝To撤审){}, JSON.toJSONString(result));logger.info(活动信息{} 状态{}, JSON.toJSONString(ActivityService.queryActivityInfo(activityId)), JSON.toJSONString(ActivityService.queryActivityStatus(activityId))); }测试结果 20:50:39.921 [main] INFO com.lino.design.test.ApiTest - 测试结果(拒绝To撤审){code:0000,info:撤销审核完成} 20:50:39.960 [main] INFO com.lino.design.test.ApiTest - 活动信息{activityId:100001,activityName:早起学习打卡领奖活动,beginTime:1675860639937,endTime:1675860639937,status:Editing} 状态Editing从审批拒绝到撤审到状态流转可以看到按照状态到流转约定审批拒绝后可以撤审测试结果满足预期。 综上以上四个测试类分别模拟了不同状态之间到有效流转和拒绝流转不同的状态服务处理不同的服务内容。 五、总结状态模式 从以上两种方式对一个需求的实现对比可以看到在使用设计模式处理后已经没有了 if-else 代码的结构也更加清晰易于扩展。在实现结构的编码方式上可以看到不再是面向过程的编程而是面向对象的编程。状态模式的优点 状态模式满足了单一职责和开闭原则。当只有满足这种结构时才会发现代码的扩展是容易的也就是增加或修改功能不会影响整体。 状态模式的缺点 如果状态和各项流转较多就会产生较多的实现类。因此可能会给代码的实现增加时间成本。因为如果遇到这种场景可以按需评估投入回报率主要在于是否会经常修改是否可以做成组件化抽离业务功能与非业务功能。
http://www.w-s-a.com/news/406473/

相关文章:

  • 做美食视频网站有哪些品牌营销策划机构
  • 佛山知名营销网站开发wordpress可视化编辑器排行
  • 石岩做网站哪家好石家庄做网站设计
  • 建设网站需要冠县做网站
  • 保定网站seo哪家公司好wordpress教程视频下载
  • 网站开发 哪些文档网站海外推广方法
  • 广西建设局网站首页如何做条形码网站怎么搞
  • 琼海建设网站wordpress 商城站下载地址
  • 网站需要多大数据库divider wordpress
  • 兰州北京网站建设网络广告推广网站
  • 宁晋网站建设森网站建设
  • 网站没有收录原因trel域名
  • 建设门户网站的目的和需求台州专业网站建设方案
  • 苏州网站建设系统方案成都行业网站设计
  • wordpress多说读者墙seo分析师招聘
  • 视频网站开发计划书wordpress文件详情
  • 重庆付费网站推广电商网站 开发周期
  • thinkcmf 做企业网站视频播放类网站建设费用
  • vps网站助手大学选修课网站建设
  • 南浦电商网站建设北京海淀社保网站
  • 传奇网站模板怎么做的吗大连警方最新通告
  • 成都私人做公司网站的北京网站建设需要多少钱
  • 魔客吧是什麼程序做的网站代理厦门网站设计公司
  • 90设计手机站东营网站推广
  • 哪家购物网站建设好专门做水生植物销售网站
  • php医院网站开发兼职app开发网上app开发
  • 接任务做兼职的的网站衡阳手机网站设计
  • 徐州经济开发区网站佛山百度关键词seo外包
  • 肃宁网站建设有限责任公司法人承担什么责任
  • 珠海斗门建设局网站如何免费做网站