当前位置: 首页 > article >正文

状态模式S

状态模式(State Pattern)是行为设计模式的一种,它允许一个对象在其内部状态发生改变时改变其行为。这个对象被视为类型的有限状态机(Finite State Machine)。

在状态模式中,我们创建表示各种状态的对象和一个上下文对象(context),该上下文对象持有当前状态的引用,并可以在不同状态之间切换。这些状态对象共享一个公共的接口,以便上下文可以与任何状态对象交互,而无需知道具体是哪个状态。这样,当状态发生改变时,上下文的行为也会相应改变,但上下文本身并不直接修改其状态,而是委托给状态对象来处理状态的转换。

组成

‌状态接口或抽象类‌(State)

定义一个接口或抽象类,以封装与特定状态相关的行为。

‌具体状态类‌(Concrete State)

实现或继承状态接口或抽象类,每个具体状态类实现与状态相关的行为,并可以定义状态转换的逻辑。

‌上下文类‌(Context)

持有一个状态对象的引用,可以委托当前状态对象处理请求,从而使得上下文的行为随状态改变而改变。上下文类通常包含一个或多个与状态相关的方法,这些方法会调用状态对象的方法。

Demo

设计一个交通信号灯系统。交通信号灯有三种状态:红灯(Red)、绿灯(Green)和黄灯(Yellow)。我使用状态模式来实现信号灯状态的切换和状态相关的行为。

定义状态接口 TrafficLightState

package org.example.state;

public interface TrafficLightState {
    void change(TrafficLight trafficLight);
}

状态接口具体的实现类 RedState,RedState,RedState

package org.example.state;

public class RedState implements TrafficLightState{
    @Override
    public void change(TrafficLight trafficLight) {
        System.out.println("Red Light -- Stop!");
        trafficLight.setState(new GreenState());
    }
}

package org.example.state;

public class GreenState implements TrafficLightState{
    @Override
    public void change(TrafficLight trafficLight) {
        System.out.println("Green Light -- Go!");
        trafficLight.setState(new YellowState());
    }
}

package org.example.state;

public class YellowState implements TrafficLightState{
    @Override
    public void change(TrafficLight trafficLight) {
        System.out.println("Yellow Light -- Gaution!");
        trafficLight.setState(new RedState());
    }
}

创建一个 TrafficLight 类作为上下文

package org.example.state;

public class TrafficLight {
    private TrafficLightState state;

    public TrafficLight() {
        this.state = new RedState();
    }

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

    public void change() {
        state.change(this);
    }
}

测试

package org.example.state;

public class StateMain {
    public static void main(String[] args) {
        TrafficLight light = new TrafficLight();
        for (int i = 0; i <= 10; i++) {
            light.change();
        }
    }
}

<font style="color:rgb(51, 51, 51);">LightState</font>接口定义了一个<font style="color:rgb(51, 51, 51);">pressButton</font>方法,该方法用于处理按下按钮时的行为。<font style="color:rgb(51, 51, 51);">OnState</font><font style="color:rgb(51, 51, 51);">OffState</font>类实现了这个接口,并分别定义了开状态和关状态下按下按钮的行为。<font style="color:rgb(51, 51, 51);">LightSwitch</font>类持有一个<font style="color:rgb(51, 51, 51);">LightState</font>对象的引用,并通过<font style="color:rgb(51, 51, 51);">pressButton</font>方法委托当前状态对象处理按下按钮的请求。在客户端代码中,我们创建了一个<font style="color:rgb(51, 51, 51);">LightSwitch</font>对象,并模拟了按下按钮的动作,可以看到电灯的状态在开和关之间切换

优点

  • ‌封装性良好‌:状态模式将状态相关的行为封装在独立的状态类中,使得状态的变化对上下文类来说是透明的。
  • ‌扩展性强‌:通过添加新的状态类,可以很容易地扩展系统的行为,而无需修改现有的代码。
  • ‌维护性高‌:状态模式使得状态转换和状态相关的行为明确且集中,有助于代码的维护和调试。
  • ‌解耦‌:状态模式将状态的行为与上下文类解耦,使得上下文类可以专注于处理业务逻辑,而无需关心状态的具体实现。

缺点

  • ‌类数量增加‌:每个状态都需要一个单独的类,这会导致系统的类数量增加,从而增加了管理的复杂性。
  • ‌逻辑分散‌:状态转换和状态相关的行为被分散到多个状态类中,这可能会使得理解和跟踪系统行为变得更加困难。
  • 适用场景

适用场景

对象的行为取决于其状态,并且这些状态在运行时会发生变化。需要使用大量的条件语句(如if-else或switch-case)来根据对象的状态选择其行为,这时可以考虑使用状态模式来替代这些条件语句,以提高代码的可读性和可维护性。


http://www.kler.cn/a/414695.html

相关文章:

  • c++设计模式模块与系统
  • scrapy豆瓣爬虫增强-批量随机请求头
  • HTML CSS JS基础考试题与答案
  • IDEA报错: java: JPS incremental annotation processing is disabled 解决
  • TS 使用泛型和 typeof约束参数
  • AWS EC2设置用户名密码登录
  • 0.查找命令
  • 【docker 拉取镜像超时问题】
  • NeurIPS 2024 数据集汇总|覆盖云层去除/化学光谱/歌声音频/自动驾驶/昆虫标本······...
  • AI 声音:数字音频、语音识别、TTS 简介与使用示例
  • 爬虫开发(5)如何写一个CSDN热门榜爬虫小程序
  • 学习日志 --A5rZ
  • git:下载与安装
  • HTTPS的安全性优势
  • Pytorch中反向传播
  • C++初阶(十六)--STL--list的模拟实现
  • QT QFormLayout控件 全面详解
  • C++中的volatile关键字
  • torch.set_printoptions
  • 房屋出租出售预约系统支持微信小程序+H5+APP
  • 【含开题报告+文档+PPT+源码】基于SpringBoot的艺术培训学校管理系统的设计与实现
  • vue2 中使用 Ag-grid-enterprise 企业版
  • 解决数据传送问题:内网http传输
  • LeetCode 力扣 热题 100道(十)回文链表(C++)
  • 【青牛科技】D1671 75Ω 带4级低通滤波的单通道视频放大电 路芯片介绍
  • 【论文阅读】三平面相关与变体