状态模式 小灰灰 2020-06-13 05:49 780阅读 0赞 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 ### 介绍 ### **意图**:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 **主要解决**:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 **何时使用**:代码中包含大量与对象状态有关的条件语句。 **如何解决**:将各种具体的状态类抽象出来。 **关键代码**:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if…else 等条件选择语句。 **应用实例** :1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。 2、曾侯乙编钟中,‘钟是抽象接口’,'钟A’等是具体状态,'曾侯乙编钟’是具体环境(Context)。 **优点** :1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。 **缺点**: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。 **使用场景** :1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。 **注意事项**:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。 ### 实现 ### 我们将创建一个 *State* 接口和实现了 *State* 接口的实体状态类。*Context* 是一个带有某个状态的类。 *StatePatternDemo*,我们的演示类使用 *Context* 和状态对象来演示 Context 在状态改变时的行为变化。 ![状态模式][format_png] #### 步骤 1 #### 创建一个接口。 *State.java* public interface State { void doAction(Context context); } #### 步骤 2 #### 创建实现接口的实体类。 *StartState.java* public class StartState implements State { @Override public void doAction(Context context) { System.out.println("Player is in start state"); context.setState(this); } @Override public String toString() { return "Start State"; } } *StopState.java* public class StopState implements State { @Override public void doAction(Context context) { System.out.println("Player is in stop state"); context.setState(this); } @Override public String toString(){ return "Stop State"; } } #### 步骤 3 #### 创建 *Context* 类。 *Context.java* public class Context { private State state; public Context() { state = null; } public State getState() { return state; } public void setState(State state) { this.state = state; } } #### 步骤 4 #### 使用 *Context* 来查看当状态 *State* 改变时的行为变化。 *StatePatternDemo.java* public class StatePatternDemo { public static void main(String[] args) { Context context = new Context(); StartState startState = new StartState(); startState.doAction(context); System.out.println(context.getState().toString()); System.out.println(); StopState stopState = new StopState(); stopState.doAction(context); System.out.println(context.getState().toString()); } } #### 步骤 5 #### 验证输出。 Player is in start state Start State Player is in stop state Stop State [format_png]: /images/1592027344442.jpg
相关 状态模式(状态机) 以前写状态机,比较常用的方式是用 if-else 或 switch-case,高级的一点是函数指针列表。最近,看了一文章[《c语言设计模式–状态模式(状态机)》][c](来源: 忘是亡心i/ 2023年02月20日 07:08/ 0 赞/ 199 阅读
相关 状态模式 状态模式定义: 英文定义:The State Pattern allows an object to alter its behavior when its interna 落日映苍穹つ/ 2022年08月02日 12:57/ 0 赞/ 64 阅读
相关 状态模式 原文链接:[http://www.tutorialspoint.com/design\_pattern/state\_pattern.htm][http_www.tutoria 亦凉/ 2022年07月21日 09:00/ 0 赞/ 69 阅读
相关 状态模式 一、动机与定义 1、现实世界中的情况 > 在现实世界中,有很多事物的行为是和它当前所处的状态紧密相关的,比如水的三态下分别有各自独特的行为,人在处于不同的状态是会有 刺骨的言语ヽ痛彻心扉/ 2022年07月16日 00:24/ 0 赞/ 128 阅读
相关 状态模式 //表示状态的接口类 public interface State { void smile(); void cry(); voi r囧r小猫/ 2022年06月10日 05:14/ 0 赞/ 251 阅读
相关 状态模式 转载请注明链接:[https://blog.csdn.net/feather\_wch/article/details/78647901][https_blog.csdn.ne 偏执的太偏执、/ 2022年06月05日 12:15/ 0 赞/ 267 阅读
相关 状态模式 1.使用场景: 常见的应用场景有线程对象各个状态之间的切换或者各种账号状态的管理等 2.UML表示 状态模式中主要有以下的几大角色: 2.1Context:环 淩亂°似流年/ 2022年05月31日 09:26/ 0 赞/ 247 阅读
相关 状态模式 状态模式 一、概述 1. 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。 2. 结构 Context环境类:环境类中维护 短命女/ 2022年04月17日 00:18/ 0 赞/ 272 阅读
相关 状态模式 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式主要解决的是的当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑 小鱼儿/ 2021年09月17日 02:38/ 0 赞/ 377 阅读
相关 状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态... 小灰灰/ 2020年06月13日 05:49/ 0 赞/ 781 阅读
还没有评论,来说两句吧...