项目中使用的设计模式之状态模式
2018-03-22 09:15
471 查看
[align=left]工作中可能会遇到很多重复的工作,重复的工作可能导致大量的工作量,可能会使重复的代码过多,也可能会导致方法的耦合性太大,动一发而牵动全身,不防考虑一些设计模式来简化工作。[/align][align=left][/align][align=left]所在项目:新工作流平台[/align][align=left][/align][align=left]功能点:切换推送代办的方式(Kafka推送代办或者rabbitMQ推送代办)[/align][align=left][/align][align=left]模式讲解:[/align][align=left][/align][align=left]状态模式把对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。[/align] [align=left]状态模式包含的角色:[/align][align=left](1) 环境(Context)角色,也成上下文:定义一个接口,接口中包含具体的状态类实例。[/align] publicclass ActTodoTaskMQManager { /** * MQ状态对象 */ private ActTodoTaskMQState mqState = null; public ActTodoTaskMQState getMQState(){ String state = PropertyUtil.getPropertyValue(PropConstant.WFPT_MQ_STATE); if(StringUtils.hasText(state)){ if(state.equals(PropConstant.WFPT_MQ_STATE_KAFKA)){ mqState = SpringContextUtil.getApplicationContext().getBean(ActKafkaTodoTaskService.class); } if(state.equals(PropConstant.WFPT_MQ_STATE_RABBIT)){ mqState = SpringContextUtil.getApplicationContext().getBean(ActRabbitMQTodoTaskService.class); } } return mqState; } } 复制代码 [align=left][/align][align=left]ActTodoTaskMQManager读取配置文件中的配置的状态和常量类对应的状态相比较,来确定使用哪个状态对象。此处实现不完美,应该在页面提供一个选择RabbitMQ还是Kafka的功能,将推送代办类型写入数据库,从数据库读取数据而不是从配置文件中读取。但是工作流KafKa已经去除所以加了配置文件。[/align][align=left][/align][align=left](2) 抽象状态(State)角色:定义一个接口,用来封装环境(Context)对象中确定的一个状态所对应的行为。[/align]public interface ActTodoTaskMQState { /** * 推送代办消息 * * @param topic * @param todoTaskList * @return * @author YixinCapital -- shaoml * 2017年5月22日 下午6:07:40 */ booleansendTodoMsg(String topic,List<TodoTaskDTO> todoTaskList); /** * 推送代办消息big更新taskHandle表 * * @param taskHandleDTO * @param distributeTaskDTO * @author YixinCapital -- shaoml * 2017年5月22日 下午5:38:06 */ voidsendTodoMsgAndUpdateTodoTask(ActExSVTaskHandleDTO taskHandleDTO,SVDistributeTaskDTOdistributeTaskDTO); /** * 推送代办消息big更新taskHandle表 * * @param taskHandleDTO * @param distributeTaskDTO * @author YixinCapital -- shaoml * 2017年5月22日 下午5:38:06 */ voidsendTodoMsgAndUpdateTodoTask(SVDistributeTaskDTO distributeTaskDTO,List<TodoTaskDTO> todoTaskList); /** * 重复推送代办 * * @param accessSystemDTO * @param todoTaskList * @return * @author YixinCapital -- shaoml * 2017年5月23日 上午11:21:35 */ booleansendTodoMsg(ActExSVAccessSystemDTO accessSystemDTO,List<ActExSVTaskHandleDTO> taskHandleList); } 复制代码 [align=left](3) 具体状态(ConcreteState)角色:实现State接口,完成真正的业务逻辑。[/align][align=left][/align]@Service("actRabbitMQTodoTaskService") public class ActRabbitMQTodoTaskService implementsActTodoTaskMQState{} @Service("actKafkaTodoTaskService") public class ActKafkaTodoTaskService implementsActTodoTaskMQState{} 复制代码 [align=left]客户端调用:[/align]ActTodoTaskMQManager mqManager = newActTodoTaskMQManager(); ActTodoTaskMQState state = mqManager.getMQState(); state.sendTodoMsgAndUpdateTodoTask(distributeTaskDTO,todoTaskList); 复制代码 [align=left]优点:再来个rocketMq,activeMQ,只需要实现ActTodoTaskMQState接口即可,扩展性很好。[/align][align=left]缺点:ActTodoTaskMQState接口中有多少方法就需要所有的实现类去实现该方法。[/align] |
相关文章推荐
- [设计模式]_[中级]_[观察者模式在项目中实际使用例子]
- Java使用设计模式中迭代器模式构建项目的代码结构示例
- 结合项目实例 回顾传统设计模式(十)状态模式
- 项目中使用到的设计模式
- Java使用设计模式中的代理模式构建项目的实例展示
- 项目中使用的设计模式之策略模式
- 状态模式在领域驱动设计中的使用(Using the State pattern in a Domain Driven Design)
- 做项目中自己使用的java设计模式-单例设计模式
- 【设计模式】使用unity实现状态模式(State mode)
- 在项目中使用设计模式思想——Abstract Factory、Factory Method、Singleton和Strategy模式的使用(上)
- Vuex内容解析和vue cli项目中使用状态管理模式Vuex
- 如何在一个项目中完美融入GreenDao并使用Facde设计模式操作数据库
- Java使用设计模式中的代理模式构建项目的实例展示
- 【JAVA】设计模式之状态模式(State模式)的使用分析
- 4.php设计模式:状态模式的使用场景
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
- [设计模式]_[中级]_[观察者模式在项目中实际使用例子]
- 解析C++编程中如何使用设计模式中的状态模式结构
- 结合项目实例 回顾传统设计模式(十)状态模式
- 在项目中使用设计模式思想——Abstract Factory、Factory Method、Singleton和Strategy模式的使用(上)