`
javahigh1
  • 浏览: 1224421 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

状态模式简单实现

 
阅读更多

工作过程中,我们经常遇到一些复杂的状态转换的问题,如果我们使用传统的方式来处理状态转换,相信状态上了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+状态模式简单实现网络五子棋+发送消息

    用Java:rmi+状态模式简单实现网络五子棋+发送消息 编译后,在class文件所在的文件夹里,dos命令执行 1》start rmiregistry 2》start java -Djava.security.policy=policy Server 3》start java Play

    状态模式的一种实现,类似于状态机

    参照《HeadFirst设计模式》中状态模式实现的类似于状态机的机制,代码简单,功能强大,有测试代码和详细注释

    python 实现 设计模式

    python 实现 状态模式1 python 实现 状态模式2(面向过程的方式-方法版) python 实现 状态模式3(分类版) python 实现 状态模式4 python 实现 抽象工厂模式1 python 实现 抽象工厂模式2 python 实现 代理模式 ...

    设计模式-状态模式的应用

    本文主要讲解下状态模式的实现方法,首先对状态模式作下简单的定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。接下来我们以一个普通的状态类来描述执行的过程,一个普通的任务...

    Android状态模式简单Demo

    Android状态模式简单Demo,模拟电视遥控器在开关机状态下的相关业务实现.避免了传统if-else冗余和难维护的写法.同步博文:http://blog.csdn.net/qq_28690547/article/details/50706448

    lua设计模式总结

    创建型模式 1、简单工厂模式lua实现 ...4、状态模式lua实现 5、迭代器模式lua实现 6、备忘录模式lua实现 7、命令模式lua实现 8、职责链模式lua实现 9、解释器模式lua实现 10、中介者模式lua实现 11、访问者模式lua实现

    状态及模板和迭代等设计模式及实现

    状态模式 模板模式 迭代器其中有他们的简单实现代码,有模式的简单讲解

    嵌入式系统的微模块化程序设计-实用状态图C/C++实现

    状态模式是GoF23个模式中最常用的之一,这篇小文不打算涉及方方面面的内容,只想在状态模式的高效运用方面谈一下自己的心得体会。  状态模式是用来设计状态机的,因此下面的叙述中将它们等同理解。有关状态机...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器 利用迭代器实现原材料 实用程序 StringUtil类 - 封装常用的String方法 ...

    设计模式课程设计---使用6个不同的设计模式完成绘图系统(java)

    运用到的设计模式有备忘录模式,迭代器模式,简单工厂模式,状态模式,模版方法模式,单例模式。 资源包含项目文件(eclipse)以及系统说明(docx文件),系统说明中说明了为什么要使用该模式,使用该模式有什么好处...

    基于Java的设计模式大作业绘图系统【六种设计模式+文档】.zip

    本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    工厂模式的常见实现方式包括简单工厂、工厂方法、抽象工厂等。 抽象工厂模式是一种创建型设计模式,它的主要目标是提供一个接口或抽象类,用于创建一系列相关或依赖的对象。该模式的主要优点在于,它可以为客户端...

    java版本的设计模式的实现demo

    根据不同的情况,可以实现简单工厂模式、工厂方法模式或抽象工厂模式。 4. 观察者模式 观察者模式是典型的行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,其所有依赖者都会得到通知并自动...

    备忘录模式 和状态模式.

    设计模式之备忘录 和 状态模式精讲 19.1 场景问题 19.1.1 开发仿真系统 考虑这样一个仿真应用,功能是:模拟运行针对某个具体问题的多个解决方案,记录运行过程的各种数据,在模拟运行完成过后,好对这多个解决...

    浅谈简单工作流设计——责任链模式配合策略与命令模式的实现

    本文以项目中的一个工作流模块,演示责任链模式、策略模式、命令模式的组合实现!最近在做的一个项目,涉及到的是一个流程性质的需求。关于工程机械行业的服务流程:服务任务流程和备件发运流程。项目之初,需求不是...

    C# 设计模式系列教程-状态模式

    把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。 3. 模式中的角色  3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给...

    Python设计模式之状态模式原理与用法详解

    主要介绍了Python设计模式之状态模式原理与用法,简单描述了状态模式的概念、原理并结合实例形式分析了Python实现与使用状态模式的相关操作技巧,需要的朋友可以参考下

    Java设计模式 版本2

    对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...

    ActionScript 3.0设计模式扫描版_方红琴译

    第10章 状态模式 用来创建一个状态机器的设计模式 状态设计模式用到的主要(30P概念 最小抽象状态设计模式 视频播放器具体状态应用程序 扩展状态设计:添加状态 添加更多的状态和流媒体播放能力 小结 第11章 ...

Global site tag (gtag.js) - Google Analytics