设计模式行为型——状态模式

📅 2026/8/22 12:08:08
设计模式行为型——状态模式
目录状态模式的定义状态模式的实现状态模式角色状态模式类图状态模式举例状态模式代码实现状态模式的特点优点缺点使用场景注意事项实际应用在软件开发过程中应用程序中的部分对象可能会根据不同的情况做出不同的行为把这种对象称为有状态的对象而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时其内部状态就会发生改变从而使其行为也发生改变。如天气都有晴天和雨天的时候不同的天气有不同的行为当然天气也会受影响其他影响变化。状态模式的定义状态模式State Pattern属于行为型设计模式也叫作状态机模式StateMachine Pattern对有状态的对象把复杂的“判断逻辑”提取到不同的状态对象中允许对象在内部状态发生改变时改变它的行为对象看起来好像修改了它的类。状态模式中类的行为是由状态决定的在不同的状态下有不同的行为。其意图是让一个对象在其内部改变的时候行为也随之改变。状态模式的核心是状态与行为绑定不同的状态对应不同的行为。在状态模式中创建表示各种状态的对象和一个行为随着状态对象改变而改变的context对象。状态模式的解决思想是当控制一个对象状态转换的条件表达式过于复杂时把相关“判断逻辑”提取出来用各个不同的类进行表示系统处于哪种情况直接使用相应的状态类对象进行处理这样能把原来复杂的逻辑判断简单化消除了 if-else、switch-case 等冗余语句代码更有层次性并且具备良好的扩展力。状态模式的实现状态模式角色环境类角色Context也称为上下文它定义了客户端需要的接口内部维护一个当前状态并负责具体状态的切换。抽象状态角色State定义一个接口用以封装环境对象中的特定状态所对应的行为可以有一个或多个行为。具体状态角色Concrete State实现抽象状态所对应的行为每一个类封装了一个状态对应的行为并且在需要的情况下进行状态切换。状态模式类图状态模式举例打篮球的时候运动员可以有正常状态不正常状态和超常状态现在就以我们打篮球时候投篮时候的状态来举例子。正常状态下运动员投十个球进五个球不正常状态下运动员投十个球进一个球和超常状态下运动员投十个球进十个球。此时投篮状态为抽象状态角色运动员的三种投篮竞技状态为具体状态角色而运动员为环境类角色。状态模式代码实现抽象状态角色package com.common.demo.pattern.state; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 抽象状态角色 投篮 * date 2023/08/07 20:56:20 */ public interface State { /** * 投篮 */ void shot(); }具体状态角色package com.common.demo.pattern.state; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 具体状态角色 投篮正常 * date 2023/08/07 21:00:07 */ public class NormalState implements State{ Override public void shot() { System.out.println(发挥正常十中五); } } package com.common.demo.pattern.state; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 具体状态角色 投篮超常 * date 2023/08/07 21:00:44 */ public class SuperState implements State{ Override public void shot() { System.out.println(发挥超长十中十); } } package com.common.demo.pattern.state; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 具体状态角色 投篮不正常 * date 2023/08/07 20:57:46 */ public class UnnormalState implements State{ Override public void shot() { System.out.println(投篮发挥失常十中一); } }环境类角色package com.common.demo.pattern.state; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 环境角色 运动员 * date 2023/08/07 21:01:45 */ public class Player { private State state new NormalState(); public void setState(State state) { this.state state; } public void shot() { state.shot(); } }测试类package com.common.demo.pattern.state; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 状态模式测试类 * date 2023/08/07 21:02:30 */ public class StateTest { public static void main(String[] args) { Player player new Player(); player.shot();//正常下投篮 player.setState(new UnnormalState()); player.shot();//不正常下投篮 player.setState(new SuperState()); player.shot();//超常下投篮 } }测试截图状态模式的特点优点将状态相关的行为封装到具体状态类中状态模式通过将不同状态的行为封装到具体状态类中使得状态之间的转换和行为的变化清晰明确。遵循开闭原则新增状态时无需修改原有代码只需要添加新的状态类和相应的转换逻辑。简化了条件判断状态模式避免了大量的条件判断语句使得代码更加可读、可维护。符合单一职责原则将特定的状态及其行为都封装到单独的类中。缺点增加了类的数量使用状态模式会增加多个具体状态类导致类的数量增加。可能造成状态转换的复杂性如果状态之间的转换逻辑比较复杂可能会导致状态转换的控制逻辑变得复杂难以维护。状态模式对开闭原则的支持并不太好对于可以切换状态的状态模式增加新的状态类需要修改那些负责状态转换的源代码否则无法切换到新增状态而且修改某个状态类的行为也需修改对应类的源代码。使用场景当对象的行为取决于其内部状态并且在运行时可以动态改变状态时可以使用状态模式。当对象有多个状态且每个状态对应的行为有所不同时可以使用状态模式。一个操作中含有庞大的分支结构并且这些分支决定于对象的状态时可以使用状态模式。注意事项状态之间的转换关系要清晰确保状态之间的转换关系清晰明确避免状态转换的混乱和错误。借助上下文对象管理状态状态模式通常需要配合上下文对象来管理状态的转换和行为委托确保状态的正确切换和行为的正确执行。状态最好不要超过5个在行为受到状态约束的时候使用状态模式且状态最好不要超过5个实际应用订单状态管理订单的生命周期包含多个状态待支付、已支付、已发货等可以使用状态模式来管理订单状态的转换和相应的行为。状态机状态机是一种广泛应用于计算机编程中的模型。状态模式可以用于实现复杂的状态机逻辑。游戏角色状态游戏中的角色可以根据不同的状态进行不同的行为状态模式可以用于管理角色的状态和行为。