设计模式之状态模式

探索设计模式:状态模式

    • [1. 概念](#1. 概念)
    • [2. 作用](#2. 作用)
    • [3. 实现](#3. 实现)
      • [3.1 定义抽象状态类](#3.1 定义抽象状态类)
      • [3.2 定义具体状态](#3.2 定义具体状态)
      • [3.3 定义环境类](#3.3 定义环境类)
      • [3.4 定义客户端](#3.4 定义客户端)
      • [3.5 结果](#3.5 结果)
    • [4. 应用场景](#4. 应用场景)

  在面向对象的设计中,状态模式是一种常用的行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为。

1. 概念


  状态模式基于状态机的概念,即一个对象可以根据其内部状态的不同展现出不同的行为 。在状态模式中,每个状态都被封装在一个单独的类中,这样当对象的状态发生变化时,对象的行为也会随之变化。这种模式的核心思想是将状态的变更逻辑从客户端代码种解耦出来,从而提高系统的灵活性和可维护性。

状态模式的基本实现涉及一下几个核心组件:

  • Context环境类):拥有一个状态属性,该属性指向当前的状态对象。环境类还提供了处理事件的方法,这些方法会委托给当前状态对象来执行。
  • State抽象状态类):定义了一个接口,用于封装与状态相关的操作。
  • ConcreteState具体状态类):实现了抽象状态类的接口,每个具体状态类都代表了一个具体的状态,并定义了在这个状态下应该具有的行为。

2. 作用


  1. 简化客户端代码:通过状态模式,客户端不再需要了解对象内部状态的细节,也不必直接管理状态的变化,这使得客户端代码更加简洁明了。
  2. 提高扩展性:如果需要增加新的状态或修改现有状态的行为,只需添加或修改相应的状态类即可,而不会影响到其他状态或客户端代码。
  3. 降低耦合度:状态模式通过将状态的管理和状态的行为分离,降低了对象之间的耦合度,使得系统更加模块化。
  4. 封装状态转换规则:将状态转换逻辑封装在状态对象内部。
  5. 集中状态相关行为:将所有与特定状态相关的行为集中到一个类中。
  6. 状态共享:允许多个上下文对象共享同一个状态对象。

3. 实现

3.1 定义抽象状态类


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

3.2 定义具体状态


java 复制代码
public class ConcreteStateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前状态为A,转换到B");
        context.setState(new ConcreteStateB());
    }
}
public class ConcreteStateB implements State{
    @Override
    public void handle(Context context) {
        System.out.println("当前状态为B, 转换到A");
        context.setState(new ConcreteStateA());
    }
}

3.3 定义环境类


java 复制代码
public class Context {

    private State state;

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

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

    public void request() {
        state.handle(this);
    }

}

3.4 定义客户端


java 复制代码
public class StateClient {

    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());

        context.request();
        context.request();
    }

}

3.5 结果


4. 应用场景


状态模式使用于以下几种情况:

  • 对象的行为依赖于其自身状态,并且必须在运行时根据状态改变其行为。
  • 代码中包含大量的与对象状态有关的条件语句,这些条件语句复杂且难以维护。
  • 需要维护一个对象的历史记录,或者对象的状态转换图非常复杂。

使用建议:

  • 当对象的行为随状态改变而变化时,考虑使用状态模式。
  • 状态模式适用于替代复杂的条件或分支语句。
相关推荐
Doris_202311 小时前
代码格式化 使用oxfmt
设计模式·架构·前端框架
Doris_202311 小时前
说一说ESLint+Prettier生效的原理
前端·设计模式·架构
Pomelooooo13 小时前
把 git commit 这件事,彻底交给 AI ——一个工程化 /git-commit 命令的设计与落地
设计模式
invicinble14 小时前
设计模式(类的拓扑结构)(描述总纲)
设计模式·原型模式
invicinble16 小时前
设计模式(类的拓扑结构)(为什么会产生设计模式,以及什么是设计模式)
linux·服务器·设计模式
Python私教18 小时前
从主题闪烁到 Markdown 阅读体验:RuyiBlog v0.1.1 的前端实现复盘
前端·状态模式
PersonalViolet18 小时前
模板方法模式实战:重构Agent工具审批,告别重复代码
设计模式·agent
老码观察19 小时前
设计模式实战解读(五):策略模式——干掉 if-else 的优雅方案
java·设计模式·策略模式
解决问题no解决代码问题19 小时前
设计模式分类介绍
java·开发语言·设计模式
烬羽20 小时前
从 Python List 到 LLM 接口:一条被忽视的 AI 入门捷径
设计模式