设计模式之:状态模式(State Pattern)

状态模式(State Pattern)

状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为。这种模式通过把状态的变化逻辑分布到State的子类之间,减少了相互间的依赖,使得状态的切换更加清晰。

状态模式的关键是将那些会随着状态改变而改变的行为抽离出来,使得状态和行为可以独立变化,不同状态下的行为可以分别管理和修改,增加新的状态或者改变状态间的转换逻辑变得更加容易。

使用状态模式的好处:
  • 封装了转换规则:状态之间的转换操作被封装在状态类中,易于修改和扩展。
  • 消除了庞大的条件分支语句:状态模式通过多态性来消除原本过多的条件分支语句。
  • 将状态的逻辑与对象的其它行为分离:这有助于集中处理对象在某一状态下的行为。

示例:简单的工作状态切换

假设我们有一个工作任务(Task)对象,这个对象有几个状态:New(新创建的任务),InProgress(正在进行的任务),Completed(已完成的任务)。我们可以使用状态模式来设计这个场景。

步骤 1:定义状态接口

首先,定义一个状态接口和实现该接口的具体状态类。

java 复制代码
interface State {
    void proceed(Task task);
}

class New implements State {
    public void proceed(Task task) {
        System.out.println("Task is starting.");
        task.setState(new InProgress());
    }
}

class InProgress implements State {
    public void proceed(Task task) {
        System.out.println("Task is in progress.");
        task.setState(new Completed());
    }
}

class Completed implements State {
    public void proceed(Task task) {
        System.out.println("Task is already completed.");
    }
}
步骤 2:创建 Context 类

然后,创建包含状态的Task类。

java 复制代码
class Task {
    private State state;

    public Task() {
        // 任务默认状态为 New
        this.state = new New();
    }

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

    public void proceed() {
        state.proceed(this);
    }
}
步骤 3:使用状态模式

最后,演示如何使用状态模式来改变Task对象的状态。

java 复制代码
public class StatePatternDemo {
    public static void main(String[] args) {
        Task task = new Task();

        task.proceed(); // Task is starting.
        task.proceed(); // Task is in progress.
        task.proceed(); // Task is already completed.
    }
}

在这个示例中,Task对象的行为随着其内部状态的改变而改变,而且状态的变更逻辑被封装在状态对象内部。这样,如果未来需要添加新的状态或者改变状态转换的逻辑,我们只需要修改或添加相应的状态类,而不需要触及到Task类的内部逻辑,这就是使用状态模式的好处。

相关推荐
ytadpole11 分钟前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
用户37215742613516 分钟前
Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
java
叫我阿柒啊44 分钟前
Java全栈开发实战:从基础到微服务的深度解析
java·微服务·kafka·vue3·springboot·jwt·前端开发
凯尔萨厮1 小时前
Java学习笔记三(封装)
java·笔记·学习
霸道流氓气质1 小时前
Java开发中常用CollectionUtils方式,以及Spring中CollectionUtils常用方法示例
java·spring
失散131 小时前
分布式专题——5 大厂Redis高并发缓存架构实战与性能优化
java·redis·分布式·缓存·架构
通达的K1 小时前
Java实战项目演示代码及流的使用
java·开发语言·windows
David爱编程1 小时前
深入 Java synchronized 底层:字节码解析与 MonitorEnter 原理全揭秘
java·后端
索迪迈科技1 小时前
Protobuf 新版“调试表示为什么有链接?为什么会打码?我该怎么改代码?
java·log4j·apache
a_blue_ice1 小时前
JAVA 面试 MySQL
java·mysql·面试