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


    状态模式(State Pattern)

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

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

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

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

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

    步骤 1:定义状态接口

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

    1. interface State {
    2. void proceed(Task task);
    3. }
    4. class New implements State {
    5. public void proceed(Task task) {
    6. System.out.println("Task is starting.");
    7. task.setState(new InProgress());
    8. }
    9. }
    10. class InProgress implements State {
    11. public void proceed(Task task) {
    12. System.out.println("Task is in progress.");
    13. task.setState(new Completed());
    14. }
    15. }
    16. class Completed implements State {
    17. public void proceed(Task task) {
    18. System.out.println("Task is already completed.");
    19. }
    20. }
    步骤 2:创建 Context 类

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

    1. class Task {
    2. private State state;
    3. public Task() {
    4. // 任务默认状态为 New
    5. this.state = new New();
    6. }
    7. public void setState(State state) {
    8. this.state = state;
    9. }
    10. public void proceed() {
    11. state.proceed(this);
    12. }
    13. }
    步骤 3:使用状态模式

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

    1. public class StatePatternDemo {
    2. public static void main(String[] args) {
    3. Task task = new Task();
    4. task.proceed(); // Task is starting.
    5. task.proceed(); // Task is in progress.
    6. task.proceed(); // Task is already completed.
    7. }
    8. }

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

  • 相关阅读:
    【MyBatis】动态SQL
    排序算法:选择排序(直接选择排序、堆排序)
    华为机试题解析018:从单向链表中删除指定值的节点(python)
    AI推介-大语言模型LLMs论文速览(arXiv方向):2024.05.05-2024.05.10
    FastJson 漏洞复现
    SpringBoot2.0---------------4、SpringBoot底层注解之配置绑定
    ai实景直播矩阵式引流---技术开发搭建(剪辑、矩阵、直播)
    C专家编程 第11章 你懂得C,所以C++不再话下 11.18 如果我的目标是那里,我不会从这里起步
    flink-sql查询配置与性能优化参数详解
    前端知识案例103-javascript基础语法-throw抛出日常
  • 原文地址:https://blog.csdn.net/www_tlj/article/details/136124932