元月's blog 元月's blog
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多

元月

临渊羡鱼,不如退而结网
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多
  • 设计模式

    • 设计模式简介
    • 设计模式之单例模式
    • 设计模式之工厂模式
    • 设计模式之原型模式
    • 设计模式之建造者模式
    • 设计模式之适配器模式
    • 设计模式之桥接模式
    • 设计模式之组合模式
    • 设计模式之装饰器模式
    • 设计模式之外观模式
    • 设计模式之享元模式
    • 设计模式之代理模式
    • 设计模式之责任链模式
    • 设计模式之命令模式
    • 设计模式之解释器模式
    • 设计模式之迭代器模式
    • 设计模式之中介者模式
    • 设计模式之备忘录模式
    • 设计模式之观察者模式
    • 设计模式之状态模式
      • 一、简介
      • 二、实现方式
      • 三、应用场景
      • 四、思维导图
    • 设计模式之策略模式
    • 设计模式之模版模式
    • 设计模式之访问者模式
    • 设计模式辨析篇
  • 高可用

  • 系统设计
  • 设计模式
元月
2022-08-21
目录

设计模式之状态模式

# 设计模式之状态模式

# 一、简介

在状态模式(State Pattern)中,类的行为是基于它的状态而改变的。这种类型的设计模式属于行为型模式

状态模式一般用来实现状态机,有限状态机( Finite State Machine),缩写为 FSM,简称为状态机。状态机有 3 个组成部分:状态(State)、事件(Event)、动作(Action)。其中,事件也称为转移条件(Transition Condition)。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。

# 二、实现方式

以在京东下单为例

  • 三种状态State:未支付、未收货、已完成。
  • 两种事件Event:支付、收货。
  • 事件触发状态的转移:支付后状态为未收货,收货后状态为已完成

  • 抽象状态类(State):状态类的接口,封装了状态及其行为

    /**
     * 状态接口
     */
    public interface IPay {
        /**
         * 支付行为
         * @param payStateMachine
         */
        void pay(PayStateMachine payStateMachine);
        /**
         * 收货行为
         * @param payStateMachine
         */
        void receive(PayStateMachine payStateMachine);
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
  • 具体状态类(ConcreteState):实现了State

    @Slf4j
    public class UnPay implements IPay{
        @Override
        public void pay(PayStateMachine payStateMachine) {
            payStateMachine.setIPay(new UnReceive());
        }
        @Override
        public void receive(PayStateMachine payStateMachine) {
            log.info("未支付,不能收货!");
        }
    }
    
    @Slf4j
    public class UnReceive implements IPay{
    
        @Override
        public void pay(PayStateMachine payStateMachine) {
            log.info("未收到货,不能支付!");
        }
    
        @Override
        public void receive(PayStateMachine payStateMachine) {
            payStateMachine.setIPay(new Final());
        }
    }
    
    @Slf4j
    public class Final implements IPay{
    
        @Override
        public void pay(PayStateMachine payStateMachine) {
            log.info("订单已完成,不能支付!");
        }
    
        @Override
        public void receive(PayStateMachine payStateMachine) {
            log.info("订单已完成,不能收货!");
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
  • 上下文对象(Context):持有State对象的引用,保持并切换各个状态。

    @Setter
    @Slf4j
    public class PayStateMachine {
        private IPay iPay;
        public PayStateMachine() {
            //初始化未支付
            iPay = new UnPay();
        }
        public void pay() {
            log.info("支付前状态{}",iPay.getClass().getSimpleName());
            this.iPay.pay(this);
            log.info("支付后状态{}",iPay.getClass().getSimpleName());
        }
        public void receive() {
            log.info("收货前状态{}",iPay.getClass().getSimpleName());
            this.iPay.receive(this);
            log.info("收货后状态{}",iPay.getClass().getSimpleName());
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
  • 测试

    public static void main(String[] args) {
            PayStateMachine payStateMachine = new PayStateMachine();
            payStateMachine.pay();
            payStateMachine.receive();
        }
    
    1
    2
    3
    4
    5

# 三、应用场景

1、行为随状态改变而改变的场景

2、条件、分支语句的代替者

# 四、思维导图

#设计模式
设计模式之观察者模式
设计模式之策略模式

← 设计模式之观察者模式 设计模式之策略模式→

最近更新
01
otter二次开发-支持按目标端主键索引Load数据
08-03
02
mvnw简介
06-21
03
gor流量复制工具
06-03
更多文章>
Theme by Vdoing | Copyright © 2022-2024 元月 | 粤ICP备2022071877号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式