设计模式-状态模式

状态模式:

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。这种模式将与特定状态相关的操作和行为封装到单独的状态类中,当对象的状态变化时,就调用相应状态类的方法来处理。

角色与结构:

1 Context(环境/上下文)

  • 环境类包含一个 State 对象的引用,并通过这个引用调用 State 对象的方法。
  • 环境类可以将自身的引用传递给 State 对象,以便在状态发生变化时更新自身状态。

2 State(抽象状态)

  • 定义了一个接口以供所有具体状态子类实现,通常声明了所有可能的行为以及一些用于切换状态的方法。

3 ConcreteState(具体状态)

  • 每个具体状态都是 State 的一个子类,每个子类都实现了 State 接口定义的所有方法。
  • 具体状态类负责在对应状态下执行相应的业务逻辑,并且可以在满足条件时更改 Context 的状态。

工作原理:

  • 当 Context 中的对象状态发生改变时,它会改变其内部持有的 State 对象为一个新的具体状态对象。之后,对 Context 执行的操作将被转发到当前持有的具体状态对象上执行。

示例代码:

状态模式java示例代码如下:

java 复制代码
// 抽象状态接口
interface State {
    void handle(Context context);
}

// 具体状态类
class ConcreteStateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("Handling state A");
        // 更改状态至 B
        context.setState(new ConcreteStateB());
    }
}

class ConcreteStateB implements State {
    @Override
    public void handle(Context context) {
        System.out.println("Handling state B");
        // 更改状态至 A
        context.setState(new ConcreteStateA());
    }
}

// 上下文类
class Context {
    private State state;

    public Context(State state) {
        setState(state);
    }

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

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

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());
        context.request(); // 输出 "Handling state A"
        context.request(); // 输出 "Handling state B"
        context.request(); // 输出 "Handling state A"
    }
}

说明:上面代码中Context 类持有 State 对象,并在请求时调用当前状态对象的 handle() 方法。每次调用 handle() 方法时,都会根据需要切换到下一个状态。

优点:

  • 减少 if-else 或 switch-case 语句:通过将状态相关的行为分发给不同的状态对象,简化了代码结构,使得状态变更更加清晰和易于管理。
  • 扩展性良好:增加新的状态只需要创建新的具体状态类,而不需要修改现有代码。
  • 遵循开闭原则:已有的状态类无需修改就能添加新状态。

应用场景:

  • ATM 自动取款机根据账户状态(如正常、冻结、透支等)的不同,执行不同的操作。
  • 游戏角色有不同的状态(如站立、行走、奔跑、跳跃),每种状态下角色的动作不同。
  • 文本编辑器中的文本格式(如普通、粗体、斜体、下划线等)可以通过状态模式进行切换。
相关推荐
小白要加油努力34 分钟前
C++设计模式--策略模式与观察者模式
开发语言·c++·设计模式
OEC小胖胖5 小时前
【React 设计模式】受控与非受控:解构 React 组件设计的核心模式
前端·react.js·设计模式·前端框架·web
pengzhuofan6 小时前
Java设计模式-外观模式
java·设计模式·外观模式
long31610 小时前
适配器模式 java demo
java·javascript·后端·程序人生·设计模式·适配器模式
##学无止境##10 小时前
从青铜到王者:Java设计模式——代理模式
java·设计模式·代理模式
pengzhuofan10 小时前
Java设计模式-适配器模式
java·设计模式·适配器模式
Meteors.10 小时前
23种设计模式——适配器模式(Adapter)详解
java·设计模式·适配器模式
牛奶咖啡1314 小时前
学习设计模式《二十三》——桥接模式
学习·设计模式·桥接模式·认识桥接模式·桥接模式的优点·何时选用桥接模式·桥接模式的使用示例
左灯右行的爱情14 小时前
深度学习设计模式:责任链(Chain of Responsibility)模式(例子+业务场景+八股)
深度学习·设计模式·责任链模式
是2的10次方啊14 小时前
🚀 Spring设计模式大揭秘:23种模式藏在你每天在用的框架里
设计模式