状态模式(State)
2016-01-09 14:45
253 查看
一、状态模式介绍
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
当遇到不同的状态遇到不同的行为的时候,可以使用状态模式
状态模式UML图
State(抽象状态类):定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteStateA,B,C(具体状态):每一个子类实现一个不同的状态或行为
Context(上下文):维护一个State子类状态的实例,这个实例中定义了当前的状态。
二、状态模式代码实现
首先按照UML图中,定义一个State接口,使用抽象类也行
然后定义几个具体的状态
开始定义重要的部分,Context上下文。这个对象中定义了当前状态
测试代码:
结果:
修改状态:房间空闲中,可以预定!
修改状态:房间已被预定!
修改状态:房间已入住!
在上面的例子中,如果不用状态模式,想要改变房间状态的话。则需要大量条件分支判断
三、总结
开发中场景:
银行系统中账号状态的管理
OA系统中公文状态的管理
酒店系统中,房间状态的管理
线程对象各状态之间的切换
状态模式的好处:
1、可以将不同状态的不同行为分割开来,将相关的行为进行局部化。以便更改局部状态
2、消除了庞大的条件分支语句。
什么时候使用状态模式呢?
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
Java23种设计模式学习笔记【目录总贴】
参考资料:
大话设计模式(带目录完整版).pdf
HEAD_FIRST设计模式(中文版).pdf
尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
当遇到不同的状态遇到不同的行为的时候,可以使用状态模式
状态模式UML图
State(抽象状态类):定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteStateA,B,C(具体状态):每一个子类实现一个不同的状态或行为
Context(上下文):维护一个State子类状态的实例,这个实例中定义了当前的状态。
二、状态模式代码实现
首先按照UML图中,定义一个State接口,使用抽象类也行
修改状态:房间空闲中,可以预定!
修改状态:房间已被预定!
修改状态:房间已入住!
在上面的例子中,如果不用状态模式,想要改变房间状态的话。则需要大量条件分支判断
开发中场景:
银行系统中账号状态的管理
OA系统中公文状态的管理
酒店系统中,房间状态的管理
线程对象各状态之间的切换
状态模式的好处:
1、可以将不同状态的不同行为分割开来,将相关的行为进行局部化。以便更改局部状态
2、消除了庞大的条件分支语句。
什么时候使用状态模式呢?
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
Java23种设计模式学习笔记【目录总贴】
参考资料:
大话设计模式(带目录完整版).pdf
HEAD_FIRST设计模式(中文版).pdf
尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】
相关文章推荐
- 新装固态硬盘SSD,在安装WIN10,显示一直请稍后及Windows安装程序无法将Windows配置为此计算机的解决方法(网上都是胡诌)
- [leetcode oj 242]Valid Anagram
- 3-8-循环队列-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
- 快速排序
- Windows平台下安装Hadoop
- 机器视觉应用
- 观察者模式(Observer)
- java单例模式
- HTML——动画效果:图片循环横向播放
- modem 指令:AT+COPS
- android 串口 调试
- mysql怎样配置ODBC数据源
- Service
- 备忘录模式(Memento)
- 3721: [PA2014] Final Bazarek 乱搞
- Save a bricked Samsung Note 3 and do extraction
- 原型模式(Prototype)
- ipython notebook
- VBA使用ListView控件时提示“库没有注册”解决方法
- 算法竞赛入门经典第二版的 纵横之谜的答案 uva 232