您的位置:首页 > 其它

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

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]
QQ截图20170621183312.png (10.38 KB, 下载次数: 0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式
相关文章推荐