状态模式
最编程
2024-07-31 15:20:37
...
介绍
状态模式它允许一个对象在其内部状态改变时改变其行为,使对象看起来似乎修改了其类。状态模式的主要目的是将对象的状态封装成不同的类,并将对象的行为委托给当前状态。
组成
- Context(环境): 维护一个对具体状态的引用,维护一个状态对象,并将与状态相关的操作委托给当前状态对象。
- State(状态): 定义一个接口或抽象类,封装了与Context的一个特定状态相关的行为。
- ConcreteState(具体状态): 实现了State接口,每个具体状态类都提供了在状态改变时处理的具体行为。
结构图
场景
假设我们有一个订单处理系统,订单在不同的状态下可以执行不同的操作,比如创建、支付、发货、完成等
版本1.0
// 不使用状态模式的订单类
class OrderWithoutState {
private String state;
public OrderWithoutState() {
// 初始状态为创建状态
state = "Created";
}
public void setState(String newState) {
this.state = newState;
}
public void processOrder() {
if ("Created".equals(state)) {
System.out.println("Order created, waiting for payment");
// 可以执行创建订单后的其他逻辑
} else if ("Paid".equals(state)) {
System.out.println("Payment received, preparing for shipment");
// 可以执行支付后的其他逻辑
} else if ("Shipped".equals(state)) {
System.out.println("Order shipped, waiting for confirmation");
// 可以执行发货后的其他逻辑
} else if ("Completed".equals(state)) {
System.out.println("Order completed, thank you for your purchase");
// 可以执行订单完成后的其他逻辑
}
}
}
// 客户端
public class WithoutStatePatternExample {
public static void main(String[] args) {
OrderWithoutState order = new OrderWithoutState();
// 创建订单
order.processOrder();
// 支付订单
order.setState("Paid");
order.processOrder();
// 发货
order.setState("Shipped");
order.processOrder();
// 完成订单
order.setState("Completed");
order.processOrder();
}
}
问题
上面的实现中,订单类包含一个表示状态的字符串属性,通过条件语句判断当前订单状态,并执行相应的逻辑。这种实现方式会导致代码中出现大量的条件判断,难以维护,并且不符合开闭原则,当需要添加新的订单状态时,需要修改原有的代码。
使用状态模式版本
// 状态接口
interface OrderState {
void processOrder(OrderContext context);
}
// 具体状态1:创建状态
class CreatedState implements OrderState {
@Override
public void processOrder(OrderContext context) {
System.out.println("Order created, waiting for payment");
// 可以执行创建订单后的其他逻辑
}
}
// 具体状态2:支付状态
class PaidState implements OrderState {
@Override
public void processOrder(OrderContext context) {
System.out.println("Payment received, preparing for shipment");
// 可以执行支付后的其他逻辑
}
}
// 具体状态3:发货状态
class ShippedState implements OrderState {
@Override
public void processOrder(OrderContext context) {
System.out.println("Order shipped, waiting for confirmation");
// 可以执行发货后的其他逻辑
}
}
// 具体状态4:完成状态
class CompletedState implements OrderState {
@Override
public void processOrder(OrderContext context) {
System.out.println("Order completed, thank you for your purchase");
// 可以执行订单完成后的其他逻辑
}
}
// 环境类:订单上下文
class OrderContext {
private OrderState currentState;
public OrderContext() {
// 初始状态为创建状态
currentState = new CreatedState();
}
public void setState(OrderState state) {
this.currentState = state;
}
public void processOrder() {
currentState.processOrder(this);
}
}
// 客户端
public class StatePatternExample {
public static void main(String[] args) {
OrderContext order = new OrderContext();
// 创建订单
order.processOrder();
// 支付订单
order.setState(new PaidState());
order.processOrder();
// 发货
order.setState(new ShippedState());
order.processOrder();
// 完成订单
order.setState(new CompletedState());
order.processOrder();
}
}
在这个版本的实现中,我们定义了订单的不同状态,并使用状态模式来处理订单状态的变化。每个具体状态类都实现了 OrderState 接口,提供了处理订单的具体逻辑。OrderContext 类是环境类,维护了当前订单的状态,并通过委托给当前状态对象来执行相应的操作。
上一篇: 基于Node.js、Vue和Element UI的银行贷款业务管理平台
下一篇: 大图分块预览导语
推荐阅读
-
学习备忘录模式:使用go编写行为型设计模式中的手撸实例
-
Java使用Socket和心跳机制来判断设备的在线状态
-
推荐几个常用在线图工具(支持时序图、用例图、类图、活动图、组件图、状态图、对象图、部署图等。同时还支持非 UML 图的甘特图、架构图等)
-
多主多从模式下的高可用Kubernetes集群部署
-
【C语言】升级版猜数字小游戏(含简单、中等、困难模式并且支持战绩查询以及界面美化)-游戏效果
-
创作一个全屏显示的QT软件,最小化后再次打开时不再保持全屏模式
-
edge浏览器使用ie兼容模式以及不安全的TLS设置
-
解决Windows 11中的Office 365登录问题:调整SSL状态
-
将原标题重新表达为:在Android中启用无障碍模式并导航至无障碍设置页面
-
如何在 Git 中重置、恢复,返回到以前的状态