项目中使用的设计模式之状态模式

工作中可能会遇到很多重复的工作,重复的工作可能导致大量的工作量,可能会使重复的代码过多,也可能会导致方法的耦合性太大,动一发而牵动全身,不防考虑一些设计模式来简化工作。
所在项目:新工作流平台
功能点:切换推送代办的方式 (Kafka 推送代办或者 rabbitMQ 推送代办 )
模式讲解:
状态模式把对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

状态模式包含的角色:
(1)    环境(Context)角色,也成上下文:定义一个接口,接口中包含具体的状态类实例。

  1. publicclass ActTodoTaskMQManager {
  2.     /**
  3.      * MQ状态对象
  4.      */
  5.     private ActTodoTaskMQState mqState = null;
  6.     public ActTodoTaskMQState getMQState(){
  7.         String state = PropertyUtil.getPropertyValue(PropConstant.WFPT_MQ_STATE);
  8.         
  9.         if(StringUtils.hasText(state)){
  10.             
  11.             if(state.equals(PropConstant.WFPT_MQ_STATE_KAFKA)){
  12.                 mqState = SpringContextUtil.getApplicationContext().getBean(ActKafkaTodoTaskService.class);
  13.             }
  14.             if(state.equals(PropConstant.WFPT_MQ_STATE_RABBIT)){
  15.                 mqState = SpringContextUtil.getApplicationContext().getBean(ActRabbitMQTodoTaskService.class);
  16.             }
  17.         }
  18.         return mqState;
  19.     }
  20. }
复制代码

ActTodoTaskMQManager 读取配置文件中的配置的状态和常量类对应的状态相比较,来确定使用哪个状态对象。此处实现不完美,应该在页面提供一个选择RabbitMQ还是Kafka的功能,将推送代办类型写入数据库,从数据库读取数据而不是从配置文件中读取。但是工作流KafKa已经去除所以加了配置文件。
(2)      抽象状态(State)角色:定义一个接口,用来封装环境(Context)对象中确定的一个状态所对应的行为。
  1. public interface ActTodoTaskMQState {
  2.          /**
  3.           * 推送代办消息
  4.           *
  5.           * @param topic
  6.           * @param todoTaskList
  7.           * @return
  8.           * @author YixinCapital -- shaoml
  9.           *            2017年5月22日 下午6:07:40
  10.           */
  11.          booleansendTodoMsg(String topic,List todoTaskList);
  12.          /**
  13.           * 推送代办消息big更新taskHandle表
  14.           *
  15.           * @param taskHandleDTO
  16.           * @param distributeTaskDTO
  17.           * @author YixinCapital -- shaoml
  18.           *            2017年5月22日 下午5:38:06
  19.           */
  20.          voidsendTodoMsgAndUpdateTodoTask(ActExSVTaskHandleDTO taskHandleDTO,SVDistributeTaskDTOdistributeTaskDTO);
  21.          
  22.          /**
  23.           * 推送代办消息big更新taskHandle表
  24.           *
  25.           * @param taskHandleDTO
  26.           * @param distributeTaskDTO
  27.           * @author YixinCapital -- shaoml
  28.           *            2017年5月22日 下午5:38:06
  29.           */
  30.          voidsendTodoMsgAndUpdateTodoTask(SVDistributeTaskDTO distributeTaskDTO,List todoTaskList);
  31.          /**
  32.           * 重复推送代办
  33.           *
  34.           * @param accessSystemDTO
  35.           * @param todoTaskList
  36.           * @return
  37.           * @author YixinCapital -- shaoml
  38.           *            2017年5月23日 上午11:21:35
  39.           */
  40.          booleansendTodoMsg(ActExSVAccessSystemDTO accessSystemDTO,List taskHandleList);
  41. }
复制代码


(3)    具体状态(ConcreteState)角色:实现State接口,完成真正的业务逻辑。
  1. @Service("actRabbitMQTodoTaskService")
  2. public class ActRabbitMQTodoTaskService implementsActTodoTaskMQState{}
  3. @Service("actKafkaTodoTaskService")
  4. public class ActKafkaTodoTaskService implementsActTodoTaskMQState{}
复制代码



客户端调用:
  1. ActTodoTaskMQManager mqManager = newActTodoTaskMQManager();
  2. ActTodoTaskMQState state = mqManager.getMQState();
  3. state.sendTodoMsgAndUpdateTodoTask(distributeTaskDTO,todoTaskList);
复制代码



优点: 再来个rocketMq activeMQ ,只需要实现ActTodoTaskMQState 接口即可,扩展性很好。
缺点:ActTodoTaskMQState 接口中有多少方法就需要所有的实现类去实现该方法。

QQ截图20170621183312.png (10.38 KB, 下载次数: 0)

你可能感兴趣的:(项目中使用的设计模式之状态模式)