12.状态模式
状态模式(State Pattern)的主要目的是把“状态相关行为”封装到状态对象中,让对象在状态切换时自动改变行为
适合使用状态模式的场景
- 对象存在清晰状态流转(订单、工单、审批等)
- 不同状态下行为差异明显
- 状态分支复杂,
switch/case已难以维护 - 希望新增状态时不改动大量旧逻辑
状态接口
interface OrderState {
name: string;
pay(ctx: OrderContext): void;
ship(ctx: OrderContext): void;
}具体状态与上下文
class PendingState implements OrderState {
name = "pending";
pay(ctx: OrderContext): void {
ctx.setState(new PaidState());
}
ship(): void {
throw new Error("待支付订单不能发货");
}
}
class PaidState implements OrderState {
name = "paid";
pay(): void {
throw new Error("订单已支付");
}
ship(ctx: OrderContext): void {
ctx.setState(new ShippedState());
}
}
class ShippedState implements OrderState {
name = "shipped";
pay(): void {
throw new Error("订单已发货,不能支付");
}
ship(): void {
throw new Error("订单已发货");
}
}
class OrderContext {
constructor(private state: OrderState = new PendingState()) {}
setState(state: OrderState): void {
this.state = state;
console.log("状态切换为:", state.name);
}
pay(): void {
this.state.pay(this);
}
ship(): void {
this.state.ship(this);
}
}使用示例
const order = new OrderContext();
order.pay();
order.ship();