工作过程中,我们经常遇到一些复杂的状态转换的问题,如果我们使用传统的方式来处理状态转换,相信状态上了10多个以上的时候,每个地方都是If else判断测试的时候,你就知道痛苦了,在处理订单状态时候,10多个状态也是常有的事情,我们可以借助状态模式来解决这个问题,在多次项目过程中,使用该模式之后明显感觉状态处理要清晰得多,即使中间涉及到删减或增加一些状态中间状态,该模式处理起来游刃有余。
状态转换,绝大多数是由于事件触发引起的,currentStatus___event___nextStatus,即在当前状态下发生了一个事件促使状态转移到下一个状态,设计模式中详细进行了阐述,这里我只给一个简单的实现。
public enum Status {
wait(1) {// 等待发送状态
@Override
protected void initMap() {
addEventTansferMap(Event.send, sended);
}
},
sended(2) {// 已经发送状态
@Override
protected void initMap() {
addEventTansferMap(Event.confirm, confirmed);
}
},
confirmed(3) {// 已经确认状态
@Override
protected void initMap() {}
};
/***************************************************************************
*
* 共有方法
*
* *******************************************************************************
*/
private Status(int value) {
this.value = value;
}
public int getValue(){
return this.value;
}
protected abstract void initMap();// 初始化映射事件状态映射关系
/**
* 根据发生的事件得到下一个状态
*
* @param e
* 事件
* @return 下一个状态,如果该事件没有造成状态改变,返回null
*/
public final Status next(Event e) {
init();
return translations.get(e);
}
/**
* 初始化事件与状态转换映射
*/
private void init() {
if (false == initialed) {// double checked
synchronized (LOCK) {
if (false == initialed) {
translations = new EnumMap<Event, Status>(Event.class);
initMap();
initialed = true;
}
}
}
}
/**
*
* @param e 发生的事件
* @param s 事件发生后转移到的状态
*/
protected void addEventTansferMap(Event e,Status s){
translations.put(e, s);
}
private Map<Event, Status> translations; //事件状态映射
private boolean initialed = false; // 映射是否已经初始化
private int value; //状态原始值
private Object LOCK = new Object();
// 事件枚举,可以单独作为一个类
public enum Event {
send, // 发送事件
confirm;// 确认事件
}
public static void main(String[] args) {
System.out.println("下一个状态:" + wait.next(Event.send));
System.out.println(sended.next(Event.confirm));
System.out.println(wait.next(Event.confirm));
}
}
由以上实现可以知道,新增一个状态,新增一个事件都非常简单。第一步,在Event中新增一个事件,第二步,在Status中新增一个状态 ,第三步,新增事件和状态转移映射(覆盖initMap即可)。
在使用时只需要使用当前的发生的事件作为参数调用next即可以得到下一个状态,非常简单。
分享到:
相关推荐
用Java:rmi+状态模式简单实现网络五子棋+发送消息 编译后,在class文件所在的文件夹里,dos命令执行 1》start rmiregistry 2》start java -Djava.security.policy=policy Server 3》start java Play
参照《HeadFirst设计模式》中状态模式实现的类似于状态机的机制,代码简单,功能强大,有测试代码和详细注释
python 实现 状态模式1 python 实现 状态模式2(面向过程的方式-方法版) python 实现 状态模式3(分类版) python 实现 状态模式4 python 实现 抽象工厂模式1 python 实现 抽象工厂模式2 python 实现 代理模式 ...
本文主要讲解下状态模式的实现方法,首先对状态模式作下简单的定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。接下来我们以一个普通的状态类来描述执行的过程,一个普通的任务...
Android状态模式简单Demo,模拟电视遥控器在开关机状态下的相关业务实现.避免了传统if-else冗余和难维护的写法.同步博文:http://blog.csdn.net/qq_28690547/article/details/50706448
创建型模式 1、简单工厂模式lua实现 ...4、状态模式lua实现 5、迭代器模式lua实现 6、备忘录模式lua实现 7、命令模式lua实现 8、职责链模式lua实现 9、解释器模式lua实现 10、中介者模式lua实现 11、访问者模式lua实现
状态模式 模板模式 迭代器其中有他们的简单实现代码,有模式的简单讲解
状态模式是GoF23个模式中最常用的之一,这篇小文不打算涉及方方面面的内容,只想在状态模式的高效运用方面谈一下自己的心得体会。 状态模式是用来设计状态机的,因此下面的叙述中将它们等同理解。有关状态机...
状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器 利用迭代器实现原材料 实用程序 StringUtil类 - 封装常用的String方法 ...
运用到的设计模式有备忘录模式,迭代器模式,简单工厂模式,状态模式,模版方法模式,单例模式。 资源包含项目文件(eclipse)以及系统说明(docx文件),系统说明中说明了为什么要使用该模式,使用该模式有什么好处...
本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...
工厂模式的常见实现方式包括简单工厂、工厂方法、抽象工厂等。 抽象工厂模式是一种创建型设计模式,它的主要目标是提供一个接口或抽象类,用于创建一系列相关或依赖的对象。该模式的主要优点在于,它可以为客户端...
根据不同的情况,可以实现简单工厂模式、工厂方法模式或抽象工厂模式。 4. 观察者模式 观察者模式是典型的行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,其所有依赖者都会得到通知并自动...
设计模式之备忘录 和 状态模式精讲 19.1 场景问题 19.1.1 开发仿真系统 考虑这样一个仿真应用,功能是:模拟运行针对某个具体问题的多个解决方案,记录运行过程的各种数据,在模拟运行完成过后,好对这多个解决...
本文以项目中的一个工作流模块,演示责任链模式、策略模式、命令模式的组合实现!最近在做的一个项目,涉及到的是一个流程性质的需求。关于工程机械行业的服务流程:服务任务流程和备件发运流程。项目之初,需求不是...
把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。 3. 模式中的角色 3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给...
主要介绍了Python设计模式之状态模式原理与用法,简单描述了状态模式的概念、原理并结合实例形式分析了Python实现与使用状态模式的相关操作技巧,需要的朋友可以参考下
对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...
第10章 状态模式 用来创建一个状态机器的设计模式 状态设计模式用到的主要(30P概念 最小抽象状态设计模式 视频播放器具体状态应用程序 扩展状态设计:添加状态 添加更多的状态和流媒体播放能力 小结 第11章 ...