设计模式-状态模式

一、什么是状态模式

当一个对象的内在状态改变时,允许改变其行为。状态模式(State Pattern): 主要用来解决对象在多种状态下转换时需要对外输出不同的行为。

结构

状态模式包含以下几个主要角色:

**Contxet:**环境角色,用于维护State状态

抽象状态(State):定义了一个接口,用于封装与上下文相关的一个状态的行为。

具体状态(Concrete State):实现了状态接口,负责处理与该状态相关的行为。具体状态对象通常会在内部维护一个对上下文对象的引用,以便根据不同的条件切换到不同的状态。

二、实现

我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。StatePatternDemo ,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。

复制代码

State接口

java 复制代码
public interface State {
    void doAction(Context context);
}

具体状态

java 复制代码
public class StartState implements State {
    @Override
    public void doAction(Context context) {
        System.out.println("设备启动中...");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "启动状态";
    }

}

public class StopState implements State {
    @Override
    public void doAction(Context context) {
        System.out.println("设备停止中...");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "停止状态";
    }
}

Context 角色

java 复制代码
public class Context {
    private State state;

    public Context() {
        this.state = null;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}

测试代码

java 复制代码
public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context();
        StartState startState = new StartState();
        startState.doAction(context);
        System.out.println(context.getState().toString());

        StopState stopState = new StopState();
        stopState.doAction(context);
        System.out.println(context.getState().toString());

    }
}

结果

三、状态模式总结

状态模式将每个状态的行为封装到一个类中,增强代码可读性。符合开闭原则,当状态过多时会产生很多状态类,系统会变得复杂、维护难度升级。使用场景当一个对象、事件有多种状态,对不同的状态要求有不同的行为时,可以考虑使用状态模式。

相关推荐
小bo波5 小时前
枚举实战
java·设计模式·枚举·后端开发·代码重构
不好听6139 小时前
Prompt 驱动 NLP:用大语言模型重新定义自然语言处理开发范式
设计模式·node.js·nlp
天文家11 小时前
深入理解装饰器与适配器:从设计模式到 Spring AOP 的工程实践
java·设计模式
workflower12 小时前
医院核心竞争力的四大重构
人工智能·安全·设计模式·重构·动态规划·scrum
星恒随风16 小时前
C++ 类和对象入门(一):从 class、访问限定符到 this 指针
开发语言·c++·笔记·学习·状态模式
折哥的程序人生 · 物流技术专研16 小时前
【电商多平台电子面单对接实战|第二篇】抖音代发电子面单对接:从“面条代码”到整洁架构的涅槃之路
设计模式·架构·系统架构·单元测试·代码规范·单一职责原则
前端不太难17 小时前
AI的下一场战争:从算力到存力
人工智能·状态模式
葫芦和十三17 小时前
范式之变|Agent 设计,换语言了
人工智能·设计模式
ourenjiang17 小时前
【学习设计模式】原型模式
学习·设计模式·原型模式
li星野17 小时前
从零搭建文件上传系统:FastAPI 后端 + Streamlit 前端
前端·状态模式·fastapi