目录
[一. 概述](#一. 概述)
[二. 主要角色](#二. 主要角色)
[三. 代码示例](#三. 代码示例)
[四. 优缺点](#四. 优缺点)
[五. 常见应用场景](#五. 常见应用场景)
一. 概述
状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定的状态相关的行为放到一个类中,并且将请求委托给当前状态对象来执行。
在状态模式中,我们创建表示各种状态的对象和一个行为随状态对象改变而改变的Context对象。
二. 主要角色
状态模式主要包含三个角色
**Context(上下文):**维护一个指向当前状态对象的引用,这个引用指向的状态对象定义了在特定时间对象将如何响应请求。
**State(状态接口):**定义一个接口,以封装与Context的某个状态相关的行为。
**Concrete State(具体状态):**实现State接口,并且包含与特定状态相关的行为。
三. 代码示例
以啊坤身体状态为例(健康和骨折的阿坤):
健康的阿坤:会唱、跳、rap。
骨折的阿坤:唱、rap。
代码示例:
-
定义状态接口
javapackage com.demo.status; /** * 文件名:State * 创建者: * 创建时间:2024-09-08 * 描述:定义状态接口 */ public interface State { //定义行为方法 void action(); }
-
定义状态接口的实现类1(健康的阿坤)
javapackage com.demo.status; /** * 文件名:HealthState * 创建者: * 创建时间:2024-09-08 * 描述:状态接口实现类 * 健康状态下的行为:唱、跳、rap */ public class HealthState implements State{ @Override public void action() { System.out.println("实习一坤年的健康练习生会:唱、跳、rap"); } }
-
定义状态接口的实现类2(骨折的阿坤)
javapackage com.demo.status; /** * 文件名:FractureState * 创建者: * 创建时间:2024-09-08 * 描述:状态接口实现类 * 骨折状态下的行为: 只能唱、rap */ public class FractureState implements State{ @Override public void action() { System.out.println("实习一坤年的骨折练习生只会:唱和rap"); } }
-
定义环境类(也就是上下文类)
javapackage com.demo.status; /** * 文件名:Context * 创建者: * 创建时间:2024-09-08 * 描述:环境类 */ public class Context { //持有状态接口的引用 private State state; public Context(State state) { this.state = state; } public void setState(State state) { this.state = state; } public void request() { state.action(); // 委托给当前状态处理请求 } }
-
测试类
javapackage com.demo.status; /** * 文件名:Main * 创建者: * 创建时间:2024-09-08 * 描述:测试类 */ public class Main { public static void main(String[] args) { //创建实现类对象(健康的啊坤) HealthState healthState = new HealthState(); //创建实现类对象(骨折的啊坤) FractureState fractureState = new FractureState(); //通过给环境传入不同的对象,执行不同的方法(传入一个健康的阿坤) Context healthContext = new Context(healthState); healthContext.request(); //通过给环境传入不同的对象,执行不同的方法(传入一个骨折的阿坤) Context fractureContext = new Context(fractureState); fractureContext.request(); } }
-
测试结果
四. 优缺点
优点:
封装性好: 将状态转换逻辑封装在状态类中,减少了Context类的复杂性。
扩展性好: 可以方便地添加新的状态类,满足开闭原则。
**状态转换清晰:**状态转换逻辑明确,易于理解和维护。**避免庞大的条件分支语句:**避免了在上下文类中使用大量的条件分支语句来根据状态改变行为。
缺点:
增加系统复杂性: 随着状态的增多,类的数量也会增多,可能导致系统变得复杂。
**可能增加系统开销:**每个状态都是一个对象,可能会增加内存开销。
五. 常见应用场景
状态模式常用于处理对象多种状态转换的情况如:
- 订单状态管理:待支付、已支付、已发货、已完成等状态转换。
- 工作流引擎:任务的不同执行阶段(如待处理、处理中、已完成)。
- 网络连接状态:连接中、已连接、断开连接等。
- UI组件的交互状态:如按钮的可用/禁用状态。