状态设计模式

状态模式(State)是一种行为型设计模式。当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。简单来说就是,一个含有多种状态的实例,其行为随状态的变化而变化。
摘要由CSDN通过智能技术生成

状态设计模式


1. 简单介绍

状态模式(State)是一种行为型设计模式。当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。简单来说就是,一个含有多种状态的实例,其行为随状态的变化而变化。

2. 使用场景
  • 当控制一个对象状态转换的条件表达式过于复杂时,采用状态模式把状态的判断逻辑转移到表示不同状态的一系列类当中,起到判断逻辑简单化的作用
3. 场景举例

电商购物时,订单的状态有非常多,如果单纯的通过if-else进行状态的判断后,进行后续操作,则代码的可维护性不高。此时可以通过状态模式,将订单的各个状态进行抽象。具体的状态下的操作,可以封装到对应的状态类型,从而将复杂的if-else判断逻辑简单化。

4. UML类图

状态模式UML类图

5. 具体实现

描述

  • 背景:网购时,订单的存在多种状态。通过状态模式,来模拟订单在不同的操作后,订单的状态变化。
  • 订单的状态:待付款(订单初始状态)、代发货、待收货、待评价、已完结
  • 订单的操作:付款(状态变为待发货)、取消订单(状态变为已完结)、发货(状态变为待收货)、收货(状态变为待评价)、评价(状态变为已完结)
  • PendingPaymentState:待付款状态类,此时可以对订单进行取消和付款
  • ToBeDeliveredState:待发货状态,订单在该状态下只能进行发货操作
  • ToBeReceivedState:待收货状态,该状态只能进行收货操作
  • CommentState:待评价状态,订单在该状态下只能进行评价操作
  • FinishedState:订单完结状态,订单无法进行任何操作
  • Client:客户端

状态转移图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ag4EdRrU-1586312336192)(./images/状态转移图.png)]

代码实现

State.java

/**
 * 状态接口,状态的变化对应其中某一个接口
 */
public interface State {
   

    /**
     * 付款
     */
    void payment() throws Exception;

    /**
     * 取消订单
     */
    void cancel() throws Exception;

    /**
     * 发货
     */
    void ship() throws Exception;

    /**
     * 收货
     */
    void receipt() throws Exception;

    /**
     * 评价
     */
    void evaluate() throws Exception;

    /**
     * 获取当前状态描述
     */
    String getCurrentState();
}

AbstractState.java

/**
 * 抽象状态类,起到适配作用
 */
public abstract class AbstractState implements State {
   

    protected Order order;

    public AbstractState(Order order) {
   
        this.order = order;
    }

    @Override
    public void payment() throws Exception {
   
        System.out.println(order.getCurrentState() + "无法进行付款操作,请先提交订单");
        throw new Exception();
    }

    @Override
    public void cancel() throws Exception {
   
        System.out.println(order.getCurrentState() + "无法进行取消操作");
        throw new Exception();
    }

    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值