当前位置: 首页 > article >正文

状态机模式

状态模式

  • 状态模式定义:
    • 使用场景
    • 角色定义
        • 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 {
    @Override
    public void pay() {
        System.out.println("订单已支付");
        context.setState(new PaidState());
    }

    @Override
    public void cancel() {
        System.out.println("订单已取消");
        context.setState(new CancelledState());
    }

    @Override
    public void ship() {
        System.out.println("订单尚未支付,不能发货");
    }

    @Override
    public void deliver() {
        System.out.println("订单尚未支付,不能发货");
    }

    @Override
    public void receive() {
        System.out.println("订单尚未支付,不能确认收货");
    }
}

2.2 订单已支付状态

// 订单已支付状态
class PaidState extends OrderState {
    @Override
    public void pay() {
        System.out.println("订单已支付,无需再次支付");
    }

    @Override
    public void cancel() {
        System.out.println("订单已取消");
        context.setState(new CancelledState());
    }

    @Override
    public void ship() {
        System.out.println("订单已发货");
        context.setState(new ShippedState());
    }

    @Override
    public void deliver() {
        System.out.println("订单尚未发货,不能确认收货");
    }

    @Override
    public void receive() {
        System.out.println("订单尚未发货,不能确认收货");
    }
}

2.3 订单已发货状态

// 订单已发货状态
class ShippedState extends OrderState {
    @Override
    public void pay() {
        System.out.println("订单已支付,无需再次支付");
    }

    @Override
    public void cancel() {
        System.out.println("订单已发货,不能取消");
    }

    @Override
    public void ship() {
        System.out.println("订单已发货,无需再次发货");
    }

    @Override
    public void deliver() {
        System.out.println("订单已签收");
        context.setState(new DeliveredState());
    }

    @Override
    public void receive() {
        System.out.println("订单尚未签收,不能确认收货");
    }
}

2.4 订单已签收状态

// 订单已签收状态
class DeliveredState extends OrderState {
    @Override
    public void pay() {
        System.out.println("订单已支付,无需再次支付");
    }

    @Override
    public void cancel() {
        System.out.println("订单已签收,不能取消");
    }

    @Override
    public void ship() {
        System.out.println("订单已签收,不能再次发货");
    }

    @Override
    public void deliver() {
        System.out.println("订单已签收,不能再次确认收货");
    }

    @Override
    public void receive() {
        System.out.println("订单已确认收货");
        context.setState(new ReceivedState());
    }
}

2.5 订单已确认收货状态

// 订单已确认收货状态
class ReceivedState extends OrderState {
    @Override
    public void pay() {
        System.out.println("订单已支付,无需再次支付");
    }

    @Override
    public void cancel() {
        System.out.println("订单已确认收货,不能取消");
    }

    @Override
    public void ship() {
        System.out.println("订单已确认收货,不能再次发货");
    }

    @Override
    public void deliver() {
        System.out.println("订单已确认收货,不能再次确认收货");
    }

    @Override
    public void receive() {
        System.out.println("订单已确认收货,无需再次确认");
    }
}

2.6 订单已取消状态

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

    @Override
    public void cancel() {
        System.out.println("订单已取消");
    }

    @Override
    public void ship() {
        System.out.println("订单已取消");
    }

    @Override
    public void deliver() {
        System.out.println("订单已取消");
    }

    @Override
    public 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.kler.cn/news/17308.html

相关文章:

  • 男子订民宿被毁约5个家庭漂泊街头 房东:住满了,没办法
  • Maven 知识点总结
  • 日撸 Java 三百行day38
  • Springboot +Flowable,任务认领和回退(一)
  • 【JavaEE】应用层自定义协议及UDP协议
  • 【技术选型】Elasticsearch 和Solr那个香?
  • shell脚本 cut工具
  • 智能交通:从车牌识别到城市智能停车
  • Linux 中实现 ssh 免密登录
  • 联通云正式启动“同舟计划”,点燃数字引擎赋能产业未来
  • 100+Python挑战性编程练习系列 -- day 3
  • 2008-2019年主要城市PITI指数
  • 简单有趣的轻量级网络 Efficientnet(网络结构详解+详细注释代码+核心思想讲解)——pytorch实现
  • 华为OD机试 - 快递业务站(Python)
  • 三分钟教你看懂 spring 官方文档
  • 【ansys】project may be corrupted and recovery information is available
  • 达梦:dts工具迁移mysql decimal(65,30)的字段,报精度超出定义
  • 净利润下滑13%,帅丰电器已掉队?
  • ChatGPT 探讨内存屏障的意内存
  • 虹科荣誉 | 虹科工业物联网产品荣获中国自动化产业年会用户信赖产品奖!
  • 将 Segment Anything 扩展到医学图像领域
  • 数据埋点2
  • 华为OD机试 - 识图谱新词挖掘(Python)
  • PBDB Data Service:Output formats and Vocabularies(输出格式与术语表)
  • 腾讯高工手写13W字“Netty速成手册”,3天走向实战
  • 《可穿戴监测中的数据质量评估》阅读笔记
  • TypeScript进阶
  • 【数字IC前端笔试真题精刷(2022年)】大疆——数字芯片开发工程师A卷
  • Python | 人脸识别系统 — 用户操作
  • 单链表——单链表的定义及基本操作(初始化、头插法尾插法建表、查找、插入、删除、判空等)