您的位置:首页 > 其它

策略模式的孪生兄弟——对状态模式的深度复习总结

2016-04-12 22:58 253 查看
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下:

和策略模式的比较

状态模式概念和例子

应用场景

责任链模式和状态模式对比

一种代码优化的思路

java.util.Iterator里也有状态模式的影子

状态模式的优缺点

有限状态机及其应用

  前面有总结——策略模式,之前早就觉得策略和状态设计模式有一些相似……

接口的常用用法都有什么?策略设计模式复习总结

  我知道策略模式是对象的行为模式,其实就是对一系列级别平等的算法的封装,它不关心算法实现,让客户端去动态的依靠 “环境” 类去选择需要的算法,因为他们能互相替换,可以说策略模式使能一系列算法可以平滑的切换。那么状态(State)模式,也是对象的行为设计模式的一种。

  官方教科书是这样定义的:状态模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。呵呵,记得早之前学设计模式,学到状态模式的概念,这么炸一看,这是解释的鸡毛啊…… 先直接看个小例子,顺着它的定义来推演:

public class GetUp extends State {
/**
* 各个具体的状态角色,实现状态类,
*/
@Override
public void doSth(PersonB personB) {
if (personB.getHour() == 7) {
System.out.println("起床啦!");
} else {
// 转移状态,明确知道 要转移到哪个 已有 的状态!
personB.setState(new HaveLunch());
// 必须要调用对应状态的行为
personB.doSth();
}
}
}


View Code
  如果有一种复杂逻辑判断,比如公司考勤系统处理员工请假的流程,不同级别,类型,部门等的员工的请假流程是不一样的!我们无法知道员工该状态的下一个状态是什么!老王是临时工,请假只需要直接领导批准,老李是正式工,请假需要先让直接领导审批,再交给主管批准,老张是安全部门的员工,请假需要的流程更复杂……或者哪天系统变化升级,请假制度修改了……换句话说就是请假系统里请假相关的各个对象并不指定(也不知道)其下一个处理的对象到底是谁,只有在客户端才设定。这怎么办?这就需要责任链设计模式解决,两者类图不一样,具体解耦责任,转移对象的流程略微的不一样,但是总的目标一致:

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

  大体上看,责任链模式要比状态模式灵活,虽然职责链模式虽然灵活,但是遵循够用原则!比如前面的状态模式的例子:Person类的闹表记录一天的状态及其对应的行为,各个状态(判断逻辑)明确知道其下一个状态(处理对象)是谁!在内部编码时就确定了,状态模式就ok了,用责任链就显得很呵呵,适合就好!

  还有简单情景下,可以使用三元运算符 condition ? : 代替简单的if-else语句,或者数组这种随机存储乃至查询性能很好的数据结构替换switch-case。但是我想的是设计模式的阴暗面!不要为了用设计模式而用设计模式!对于switch-case语句块,也不要过度优化,数量不是很大时,switch的性能也不差,没必要优化什么,想起来《Java编程思想》作者埃克尔说的,等到迫不得已必须要这么做的时候,再想优化,不要陷入优化和设计模式的陷阱

  JDK里都有哪些类有状态模式的应用?

  Java集合框架专题:

java.util.Iterator源码走读——总结迭代器模式和状态模式

  

  什么是有限状态机?在Java中有什么应用?

  先看教科书的具体定义:(Finite-state machine, FSM),又称有限状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。FSM是一种算法思想,简单而言,有限状态机由一组状态、一个初始状态、输入和根据输入及现有状态转换为下一个状态的转换函数组成。而本文总结的State模式(状态模式)其实本质就是一种面向对象的状态机思想,可以适应非常复杂的状态管理。

  它反映从系统开始到现在时刻输入的变化,以及各个状态之间转移的指示变更,而且必须使用能满足状态转移的条件来描述,状态机里的动作是在给定时刻要进行的活动描述,状态机里的状态存储的是有关于过去的信息,它有多种类型的动作:

进入动作(entry action):在进入状态时进行;

退出动作:在退出状态时进行;

输入动作:依赖于当前状态和输入条件进行;

转移动作:在特定转移时进行。

  说了那么多,它到底能干嘛的呢,其实不论编程还是生活里,状态机无时不在!我知道,编程是对现实的抽象,状态机也是,当业务逻辑里有大量逻辑判断需要各种来回的转换状态时,有限状态机就有用了,本质上其是用查表法把处理逻辑独立到表中:



可以用通用的代码去处理任意复杂的状态转换,扩展开来,任何复杂状态逻辑的处理都可以比如:

Java的多线程里,线程的状态转移,就可以使用状态机来描述

经常需要使用的正则表达式,判断字符串格式和解析字符串内容基本全靠它,正则表达式就是有限状态机。仅仅表达形式不同,正则表达式写好后可以通过程序“编译”成状态转换表,就是大家常见的状态转换图。

各种网络协议,记得上计算机网络课时老师讲过——所有的协议定义都有明确的“有限状态机”设计,为此国际电信联盟专门出了规格描述语言SDL(Specification and Description Language)来描述有限状态机。

众所周知的自动客服系统(如10086:接通之后大堆话,按1给查……按2查……按0转……按xx返回xx……)

编译器设计中,词法分析和语法分析都会用到

字符串匹配的 KMP 算法也是自动机算法的一种

游戏开发和设计中,比如一个NPC就是一个很典型的状态机,当玩家按下前进键时,它会从正常状态转移到向前走的状态……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: