状态机模式

news/2024/10/22 16:55:59/

状态模式

  • 状态模式定义:
    • 使用场景
    • 角色定义
        • 1. State一抽象状态角色
        • 2. ConcreteState一-具体状态角色
        • 3. Context--环境角色
    • 需求背景
      • 1. 订单状态抽象类
      • 2. 定义订单具体状态类并集成基类(抽象类)
        • 2.1 订单创建状态
        • 2.2 订单已支付状态
        • 2.3 订单已发货状态
        • 2.4 订单已签收状态
        • 2.5 订单已确认收货状态
        • 2.6 订单已取消状态
      • 3. 订单上下文类
      • 4. 测试案例
      • 5. 案例说明
        • 5.1 在测试案例中,我们首先创建了一个OrderContext对象,并在其上调用pay()方法,此时订单状态从CreatedState转换为PaidState。
        • 5.2 接着依次调用了ship()、deliver()和receive()方法,订单状态分别从PaidState转换为ShippedState、ShippedState转换为DeliveredState、DeliveredState转换为ReceivedState。
        • 5.3 然后尝试再次调用receive()、ship()、pay()和deliver()方法,此时订单状态已经处于ReceivedState,不能再进行状态转换了。
        • 5.4 最后调用了cancel()方法,此时订单状态由ReceivedState转换为CancelledState。

状态模式定义:

当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类

使用场景

使用场景: 1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。

角色定义

1. State一抽象状态角色

接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换

2. ConcreteState一-具体状态角色

每一个具体状态必须完成两个职责: 本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。

3. Context–环境角色

定义客户端需要的接口,并且负责具体状态的切换

需求背景

针对用户购买的商品完成订单不同状态之间的流(未支付、已支付、已发货、已签收、已确认等)。

下面是一个简单的Java示例代码:

1. 订单状态抽象类

// 订单状态抽象类
abstract class OrderState {protected OrderContext context;public void setContext(OrderContext context) {this.context = context;}public abstract void pay();public abstract void cancel();public abstract void ship();public abstract void deliver();public abstract void receive();
}

2. 定义订单具体状态类并集成基类(抽象类)

2.1 订单创建状态

// 订单创建状态
class CreatedState extends OrderState {@Overridepublic void pay() {System.out.println("订单已支付");context.setState(new PaidState());}@Overridepublic void cancel() {System.out.println("订单已取消");context.setState(new CancelledState());}@Overridepublic void ship() {System.out.println("订单尚未支付,不能发货");}@Overridepublic void deliver() {System.out.println("订单尚未支付,不能发货");}@Overridepublic void receive() {System.out.println("订单尚未支付,不能确认收货");}
}

2.2 订单已支付状态

// 订单已支付状态
class PaidState extends OrderState {@Overridepublic void pay() {System.out.println("订单已支付,无需再次支付");}@Overridepublic void cancel() {System.out.println("订单已取消");context.setState(new CancelledState());}@Overridepublic void ship() {System.out.println("订单已发货");context.setState(new ShippedState());}@Overridepublic void deliver() {System.out.println("订单尚未发货,不能确认收货");}@Overridepublic void receive() {System.out.println("订单尚未发货,不能确认收货");}
}

2.3 订单已发货状态

// 订单已发货状态
class ShippedState extends OrderState {@Overridepublic void pay() {System.out.println("订单已支付,无需再次支付");}@Overridepublic void cancel() {System.out.println("订单已发货,不能取消");}@Overridepublic void ship() {System.out.println("订单已发货,无需再次发货");}@Overridepublic void deliver() {System.out.println("订单已签收");context.setState(new DeliveredState());}@Overridepublic void receive() {System.out.println("订单尚未签收,不能确认收货");}
}

2.4 订单已签收状态

// 订单已签收状态
class DeliveredState extends OrderState {@Overridepublic void pay() {System.out.println("订单已支付,无需再次支付");}@Overridepublic void cancel() {System.out.println("订单已签收,不能取消");}@Overridepublic void ship() {System.out.println("订单已签收,不能再次发货");}@Overridepublic void deliver() {System.out.println("订单已签收,不能再次确认收货");}@Overridepublic void receive() {System.out.println("订单已确认收货");context.setState(new ReceivedState());}
}

2.5 订单已确认收货状态

// 订单已确认收货状态
class ReceivedState extends OrderState {@Overridepublic void pay() {System.out.println("订单已支付,无需再次支付");}@Overridepublic void cancel() {System.out.println("订单已确认收货,不能取消");}@Overridepublic void ship() {System.out.println("订单已确认收货,不能再次发货");}@Overridepublic void deliver() {System.out.println("订单已确认收货,不能再次确认收货");}@Overridepublic void receive() {System.out.println("订单已确认收货,无需再次确认");}
}

2.6 订单已取消状态

//订单已取消
public class CancelledState extends OrderState  {@Overridepublic void pay() {System.out.println("订单已取消");}@Overridepublic void cancel() {System.out.println("订单已取消");}@Overridepublic void ship() {System.out.println("订单已取消");}@Overridepublic void deliver() {System.out.println("订单已取消");}@Overridepublic void receive() {System.out.println("订单已取消");}
}

3. 订单上下文类

// 订单上下文类
class OrderContext {private OrderState state;public OrderContext() {setState(new CreatedState());}public void setState(OrderState state) {this.state = state;this.state.setContext(this);}public void pay() {state.pay();}public void cancel() {state.cancel();}public void ship() {state.ship();}public void deliver() {state.deliver();}public void receive() {state.receive();}
}

4. 测试案例

// 测试案例
public class StateTest {public static void main(String[] args) {OrderContext order = new OrderContext();order.pay(); // 订单已支付order.ship(); // 订单已发货order.deliver(); // 订单已签收order.receive(); // 订单已确认收货order.receive(); // 订单已确认收货,无需再次确认order.ship(); // 订单已确认收货,不能再次发货order.pay(); // 订单已确认收货,无需再次支付order.deliver(); // 订单已确认收货,不能再次确认收货order.cancel(); // 订单已确认收货,不能取消}
}

5. 案例说明

5.1 在测试案例中,我们首先创建了一个OrderContext对象,并在其上调用pay()方法,此时订单状态从CreatedState转换为PaidState。

5.2 接着依次调用了ship()、deliver()和receive()方法,订单状态分别从PaidState转换为ShippedState、ShippedState转换为DeliveredState、DeliveredState转换为ReceivedState。

5.3 然后尝试再次调用receive()、ship()、pay()和deliver()方法,此时订单状态已经处于ReceivedState,不能再进行状态转换了。

5.4 最后调用了cancel()方法,此时订单状态由ReceivedState转换为CancelledState。


http://www.ppmy.cn/news/57466.html

相关文章

9.Java中异常处理机制是什么

Java的异常处理通过五个关键字来实现,分别是捕获异常:try,catchsfinally;声明异常:throws;抛出异常:throw 一:try,catch捕获异常二:finally回收资源三&#x…

青少年软件编程(C语言) 等级考试试卷(五级)2021年12月

青少年软件编程(C语言) 等级考试试卷(五级)2021年12月1.书架 题目描述 John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。 John共有N头奶牛(1 ≤ N ≤ 20,000),…

746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 示例 1&#xff…

【LeetCode】236. 二叉树的最近公共祖先

1.问题 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是…

Linux驱动之input输入子系统

输入子系统用于实现Linux系统输入设备(鼠标 键盘 触摸屏 游戏杆)驱动的一种框架。Linux内核将其中的固定部分放入内核,驱动开发时只需要实现其中的不固定部分(主要还是和硬件相关的部分),这和platform设备…

【五一创作】人工智能前沿知识

人工智能是一种在计算机系统中模拟人类智能和思维的技术。近年来,人工智能技术得到了飞速发展,涉及到了各个领域,如自然语言处理、计算机视觉、智能机器人等。在这篇文章中,我将介绍人工智能的前沿知识。 一、深度学习 深度学习…

武忠祥老师每日一题||不定积分基础训练(三)

有理函数不定积分: ∫ 1 x 1 x 3 d x \int \frac{1x}{1x^3}\,{\rm d}x ∫1x31x​dx ∫ 1 x ( 1 x ) ( 1 − x x 2 ) d x ( 1 ) \int \frac{1x}{(1x)(1-xx^2)}\,{\rm d}x(1) ∫(1x)(1−xx2)1x​dx(1) ∫ 1 x 2 − x 1 d x ( 2 ) \int \frac{1}{x^2-x1} \,{\rm d}x(2)…

Windows安装rabbitmq

Windows安装rabbitmq 一、下载1、下载erlang2、下载rabbitmq 二、安装1、安装erlang2、安装rabbitmq3、简单使用 一、下载 1、下载erlang 点击右侧下载地址,跳转下载,点击下载 跳转后,点击download windows install即可下载。 2、下载rab…