设计模式-状态模式实现状态机
1.概述
在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if... ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱。维护也会很麻烦。那么我就考虑只修改自身状态的模式。
2.组成
环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State): 定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState): 每一子类实现一个与Context的一个状态相关的行为。3.应用
在下面的两种情况下均可使用State模式:
1) • 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
2) • 代码中包含大量与对象状态有关的条件语句:一个操作中含有庞大的多分支的条件(if else(或switch case)语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常 , 有多个操作包含这一相同的条件结构。 State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。4.结构
5.优缺点
状态模式的优点:
1 ) 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来: State模式将所有与一个特定的状态相关的行为都放入一个对象中。因为所有与状态相关的代码都存在于某一个State子类中, 所以通过定义新的子类可以很容易的增加新的状态和转换。另一个方法是使用数据值定义内部状态并且让 Context操作来显式地检查这些数据。但这样将会使整个Context的实现中遍布看起来很相似的条件if else语句或switch case语句。增加一个新的状态可能需要改变若干个操作, 这就使得维护变得复杂了。State模式避免了这个问题, 但可能会引入另一个问题, 因为该模式将不同状态的行为分布在多个State子类中。这就增加了子类的数目,相对于单个类的实现来说不够紧凑。但是如果有许多状态时这样的分布实际上更好一些, 否则需要使用巨大的条件语句。正如很长的过程一样,巨大的条件语句是不受欢迎的。它们形成一大整块并且使得代码不够清晰,这又使得它们难以修改和扩展。 State模式提供了一个更好的方法来组织与特定状态相关的代码。决定状态转移的逻辑不在单块的 i f或s w i t c h语句中, 而是分布在State子类之间。将每一个状态转换和动作封装到一个类中,就把着眼点从执行状态提高到整个对象的状态。这将使代码结构化并使其意图更加清晰。2) 它使得状态转换显式化: 当一个对象仅以内部数据值来定义当前状态时 , 其状态仅表现为对一些变量的赋值,这不够明确。为不同的状态引入独立的对象使得转换变得更加明确。而且, State对象可保证Context不会发生内部状态不一致的情况,因为从 Context的角度看,状态转换是原子的—只需重新绑定一个变量(即Context的State对象变量),而无需为多个变量赋值
3) State对象可被共享 如果State对象没有实例变量—即它们表示的状态完全以它们的类型来编码—那么各Context对象可以共享一个State对象。当状态以这种方式被共享时, 它们必然是没有内部状态, 只有行为的轻量级对象。
状态模式的缺点:
1) 状态模式的使用必然会增加系统类和对象的个数。
2) 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。6.代码实现
//抽象状态
public abstract class State {//状态:black->red->blue->green-black
public abstract void push(Context context);//下一个状态
public abstract void pull(Context context);//上一个状态
public abstract String getColor();
}//黑色状态
public class BlackState extends State{
@Override
public void pull(Context context) {
context.setState(new GreenState());
}
@Override
public void push(Context context) {
context.setState(new RedState());}
@Override
public String getColor() {
// TODO Auto-generated method stub
return "BLACK";
}
}//蓝色状态
public class BlueState extends State{
@Override
public void pull(Context context) {
context.setState(new RedState());
}
@Override
public void push(Context context) {
context.setState(new GreenState());}
@Override
public String getColor() {
// TODO Auto-generated method stub
return "BLUE";
}
}//绿色状态
public class GreenState extends State{
@Override
public void pull(Context context) {
context.setState(new BlueState());}
@Override
public void push(Context context) {
context.setState(new BlackState());
}
@Override
public String getColor() {
// TODO Auto-generated method stub
return "GREEN";
}
}//红色状态
public class RedState extends State{
@Override
public void pull(Context context) {
context.setState(new BlackState());
}
@Override
public void push(Context context) {
context.setState(new BlueState());
}
@Override
public String getColor() {
// TODO Auto-generated method stub
return "RED";
}
}//环境类
public class Context {
private State state;
public void setState(State state){
this.state = state;
}
public void push(){
state.push(this);
System.out.println("push:"+state.getColor());
}
public void pull(){
state.pull(this);
System.out.println("pull:"+state.getColor());
}
}//测试类
public static void main(String[] args) {
Context context = new Context();
context.setState(new BlackState());//初始化状态为黑色
context.push();
context.push();
context.push();
context.push();
context.push();
context.push();
}打印结果:
push:RED
push:BLUE
push:GREEN
push:BLACK
push:RED
push:BLUE
设计模式-状态模式实现状态机相关推荐
- 设计模式 - 状态模式(状态机)
有限状态机(英语:finite-state machine,缩写:FSM) 有限状态机又称有限状态自动机(英语:finite-state automation,缩写:FSA),简称状态机,是表示有限个 ...
- 设计模式:状态模式与状态机
文章目录 前言 状态模式 实现 状态机 概念 状态 事件 动作 实现技巧 实战 分析 总结 前言 在工作时遇到了这样一个需求: 控制消毒柜: 1. 当柜门打开时,关闭消毒,并重置已消毒时间: 2. 当 ...
- 趣谈设计模式 | 状态模式(State):如何实现游戏中的状态切换?
文章目录 案例:马里奥积分竞赛 有限状态机 分支逻辑法 查表法 状态模式 状态模式与策略模式 总结 完整代码与文档 案例:马里奥积分竞赛 喜欢马里奥的小伙伴们都应该知道,前不久马里奥为了庆祝35周年, ...
- Java 有限状态机 (设计模式——状态模式)
Java 有限状态机 (设计模式--状态模式) 编写代码的时候,有时会遇见较为复杂的swith...case...和if...else...语句.这一刻有时会想到状态机,用有限状态机替换swith.. ...
- Python设计模式-状态模式
Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...
- Java 设计模式——状态模式
概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...
- 设计模式状态模式uml_UML的完整形式是什么?
设计模式状态模式uml UML:统一建模语言 (UML: Unified Modeling Language) UML is an abbreviation of Unified Modeling L ...
- C++设计模式——状态模式
C++设计模式--状态模式 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. 1 2 3 4 5 6 7 8 9 10 ...
- C++设计模式——状态模式(state pattern)
一.原理讲解 别名状态对象(object for state). 1.1意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 1.2应用场景 一个对象的行为取决于它的状态,并 ...
最新文章
- 顶级数据库管理系统的性能比较研究(论文翻译)
- Date, TimeZone, MongoDB, java中date的时区问题
- 第六章 非编码RNA鉴定
- mysql5.6之key_buffer_size优化设置
- linux deb文件安装_如何在 Ubuntu 上安装 VirtualBox | Linux 中国
- 艾弗森、穆大叔遭“姚式幽默”调侃 全场爆笑
- 定制一个网络文件系统
- why do we use process keys
- python自动化开发和全栈开发_python全栈开发devops运维自动化方向初到高级在线课程分享...
- 等级考试(四):二级C++---回首往昔考试历程
- I00006 打印等腰三角形字符图案(底边在下)
- 卡西欧(casio)Fx-5800p程序调试器||模拟器V1.0
- skimage 安装和子模块
- 【手把手教安装】VUE安装教程!!!
- 组合导航中常见的英文单词、短语翻译
- Kubernetes 学习总结(35)—— Kubernetes 1.25 正式发布,多方面重大突破
- 《C语言程序设计》第五版谭浩强课后答案 第九章《用户自己建立数据类型​》习题答案 (大一大二、考研、计算机二级必看)
- SMB实现共享文件(上传、下载)
- 架构师进阶之四redis实现分布式锁redission
- 饥荒联机版Mod开发——制作烹饪锅食物(六)
热门文章
- [益智]:有3箱水果,一箱是苹果,一箱是橘子,一箱是两种水果的混装
- matlab2020b linux,Ubuntu18.04安装MATLAB2020b
- java计算机毕业设计中药材电子商务平台源码+mysql数据库+系统+部署+lw文档
- QQ集体被盗号,猝不及防的大型社死名场面
- VisualStudio代码放在不同文件夹下进行管理,设置包含目录
- C++-proto文件
- rk3568点亮LCD(lvds)
- 论文阅读笔记|2023 AAAI 多模态论文研读
- 猎聘网简历优化收费服务怎么样?
- Sqlserver表和索引压缩