1、简述
状态模式是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。它将状态相关的行为抽取到独立的状态类中,使得增加新状态变得简单,且不影响其他状态。
设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git
本文将详细介绍状态模式的概念、结构、优缺点,以及实际应用案例。
2、什么是状态模式?
状态模式通过将对象的行为与其内部状态解耦,来实现行为的动态切换。它通过引入一系列状态类,每个类封装一种状态下的行为。
典型应用场景包括:
- 文件下载状态管理(开始、暂停、完成)。
- 游戏角色状态(攻击、移动、防御)。
- 工作流管理(审批状态)。
状态模式包含以下角色:
- 上下文(Context):维护状态实例,定义客户端与状态的交互接口。
- 状态(State):定义状态的公共接口。
- 具体状态(ConcreteState):实现特定状态下的行为。
类图:
Context <--> State <--> ConcreteState
3、实际案例
假设我们需要管理订单的状态,包括:待支付、已支付、已完成。
// 状态接口
public interface OrderState {
void handleOrder();
}
// 具体状态类
public class PendingState implements OrderState {
@Override
public void handleOrder() {
System.out.println("订单状态:待支付。请完成支付!");
}
}
public class PaidState implements OrderState {
@Override
public void handleOrder() {
System.out.println("订单状态:已支付。订单处理中。");
}
}
public class CompletedState implements OrderState {
@Override
public void handleOrder() {
System.out.println("订单状态:已完成。感谢您的购买!");
}
}
// 上下文类
public class OrderContext {
private OrderState state;
public void setState(OrderState state) {
this.state = state;
}
public void processOrder() {
if (state != null) {
state.handleOrder();
} else {
System.out.println("订单状态未设置。");
}
}
}
// 测试类
public class StatePatternDemo {
public static void main(String[] args) {
OrderContext order = new OrderContext();
// 设置为待支付状态
order.setState(new PendingState());
order.processOrder();
// 设置为已支付状态
order.setState(new PaidState());
order.processOrder();
// 设置为已完成状态
order.setState(new CompletedState());
order.processOrder();
}
}
输出:
订单状态:待支付。请完成支付!
订单状态:已支付。订单处理中。
订单状态:已完成。感谢您的购买!
4、状态模式的高级应用
电梯可以有以下状态:停止、运行、维护。
// 状态接口
public interface ElevatorState {
void performAction();
}
// 具体状态类
public class StoppedState implements ElevatorState {
@Override
public void performAction() {
System.out.println("电梯已停止,等待指令。");
}
}
public class RunningState implements ElevatorState {
@Override
public void performAction() {
System.out.println("电梯正在运行。");
}
}
public class MaintenanceState implements ElevatorState {
@Override
public void performAction() {
System.out.println("电梯处于维护模式。");
}
}
// 上下文类
public class Elevator {
private ElevatorState state;
public void setState(ElevatorState state) {
this.state = state;
}
public void operate() {
if (state != null) {
state.performAction();
} else {
System.out.println("电梯状态未设置。");
}
}
}
// 测试类
public class ElevatorDemo {
public static void main(String[] args) {
Elevator elevator = new Elevator();
// 设置为停止状态
elevator.setState(new StoppedState());
elevator.operate();
// 设置为运行状态
elevator.setState(new RunningState());
elevator.operate();
// 设置为维护状态
elevator.setState(new MaintenanceState());
elevator.operate();
}
}
输出:
电梯已停止,等待指令。
电梯正在运行。
电梯处于维护模式。
5、状态模式的优缺点
优点
- 代码清晰:将状态逻辑分散到不同的状态类中,减少了上下文类的复杂性。
- 扩展性强:添加新状态只需新增状态类,无需修改现有代码。
- 遵循开闭原则:状态的变化对其他状态透明。
缺点
- 类数量增加:每种状态都需要创建一个具体状态类。
- 上下文与状态耦合:上下文需要与具体状态进行交互。
6、应用场景
- 工作流管理:根据状态切换执行不同操作。
- 游戏开发:角色、任务等状态管理。
- 设备控制:电梯、交通信号灯等。
7、总结
状态模式通过将状态与行为分离,使得复杂状态逻辑的管理变得简单易扩展。在需要频繁切换状态且状态行为差异较大的场景中,状态模式是一种非常实用的设计模式。
希望本文对您理解和应用状态模式有所帮助!欢迎交流讨论!
评论区