状态模式

介绍

**定义:**状态模式专门用于解决系统中复杂对象不同状态下行为的封装及状态转换问题. 状态模式将一个对象的状态从该对象中提取出来并封装到专门的状态类中, 使对象的状态可以灵活的变化.

UML

示例

java 复制代码
package com.sumlv.demo;

import com.sumlv.demo.state.WaterContext;

public class Main {

    public static void main(String[] args) {
        WaterContext context = new WaterContext();
        context.gaseous();
        context.liquid();
        context.solid();

        System.out.println(context.getCurrentState());
    }

}
java 复制代码
package com.sumlv.demo.state;

/**
 * 水的上下文(上下文类)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-23
 */
public class WaterContext {

    private WaterState currentState;

    private final WaterState GASEOUS_STATE;

    private final WaterState LIQUID_STATE;

    private final WaterState SOLID_STATE;

    public void gaseous() {
        this.currentState.gaseous();
    }

    public void liquid() {
        this.currentState.liquid();
    }

    public void solid() {
        this.currentState.solid();
    }

    public WaterContext() {
        this.currentState = new LiquidState(this);
        this.GASEOUS_STATE = new GaseousState(this);
        this.LIQUID_STATE = new LiquidState(this);
        this.SOLID_STATE = new SolidState(this);
    }

    public void setCurrentState(WaterState state) {
        this.currentState = state;
    }

    public WaterState getCurrentState() {
        return this.currentState;
    }

    public WaterState getGaseousState() {
        return this.GASEOUS_STATE;
    }

    public WaterState getLiquidState() {
        return this.LIQUID_STATE;
    }

    public WaterState getSolidState() {
        return this.SOLID_STATE;
    }

}
java 复制代码
package com.sumlv.demo.state;

/**
 * 水的状态(抽象状态)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-23
 */
public interface WaterState{

    void gaseous();

    void liquid();

    void solid();

}
java 复制代码
package com.sumlv.demo.state;

/**
 * 汽化状态(具体状态)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-23
 */
public class GaseousState implements WaterState {

    private final WaterContext CONTEXT;

    public GaseousState(WaterContext CONTEXT) {
        this.CONTEXT = CONTEXT;
    }

    @Override
    public void gaseous() {
        System.out.println("已经是气体");
    }

    @Override
    public void liquid() {
        System.out.println("液化完成");
        CONTEXT.setCurrentState(CONTEXT.getLiquidState());
    }

    @Override
    public void solid() {
        System.out.println("需要先液化");
    }

}
java 复制代码
package com.sumlv.demo.state;

/**
 * 液化状态(具体状态)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-23
 */
public class LiquidState implements WaterState {

    private final WaterContext CONTEXT;

    public LiquidState(WaterContext CONTEXT) {
        this.CONTEXT = CONTEXT;
    }

    @Override
    public void gaseous() {
        System.out.println("汽化完成");
        CONTEXT.setCurrentState(CONTEXT.getGaseousState());
    }

    @Override
    public void liquid() {
        System.out.println("已经是液体");
    }

    @Override
    public void solid() {
        System.out.println("固化完成");
        CONTEXT.setCurrentState(CONTEXT.getSolidState());
    }

}
java 复制代码
package com.sumlv.demo.state;

/**
 * 固化状态(具体状态)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-23
 */
public class SolidState implements WaterState {

    private final WaterContext CONTEXT;

    public SolidState(WaterContext CONTEXT) {
        this.CONTEXT = CONTEXT;
    }

    @Override
    public void gaseous() {
        System.out.println("需要先液化");
    }

    @Override
    public void liquid() {
        System.out.println("液化完成");
        CONTEXT.setCurrentState(CONTEXT.getLiquidState());
    }

    @Override
    public void solid() {
        System.out.println("已经是固体");
    }

}

总结

使用场景

  1. 当对象需要根据不同状态来进行不同的行为时;

  2. 当对象状态改变需要用到大量if else语句时.

优点:

1.将某个状态的所有行为集中放置在一个类中可以更加灵活的对状态进行管理(只需改变对象的状态即可改变其行为);

2.将状态对象与状态转换逻辑合为一体的方式可以使逻辑更为清晰, 避免出现巨大的条件语句块.

缺点:

  1. 状态的增加必然造成类个数的增加, 增加了系统复杂度;

  2. 状态模式的结构与实现都较为复杂, 使用不当容易造成代码结构与逻辑混乱;

  3. 增加新的状态需要同步修改状态转换的逻辑, 不符合开闭原则.

相关推荐
知守观16 分钟前
HTML 转 PDF 方案实战:iTextPDF 与 wkhtmltopdf 踩坑复盘,附 Flying Saucer / openhtmltopdf 选型对比
java·后端
2601_9620715718 分钟前
类变量和全局变量的隔离性有什么区别?
java·开发语言·jvm
the3clipse23 分钟前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
海绵宝宝转agent25 分钟前
LeetCode100 LRU缓存思路讲解
java·开发语言·缓存
CQU_JIAKE26 分钟前
10.4【A】
算法
专业程序开发源26 分钟前
springboot高校学生社团管理系统74810-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
youdexiang32 分钟前
AI 生成会议纪要好用吗?多款 APP 功能分析
java·人工智能·音视频
Godspeed Zhao42 分钟前
现代智能雷达技术19——算法(5)
算法
(Charon)44 分钟前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro1 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理