首页 > 其他分享 >状态模式的好处是什么

状态模式的好处是什么

时间:2024-07-04 22:42:19浏览次数:17  
标签:状态 void 模式 ElevatorContext 好处 Elevator context public

状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态发生改变时改变其行为,使得对象看起来好像修改了其类。状态模式的核心思想是将与某个状态相关的行为封装到一个独立的状态类中,以便在对象状态发生变化时,可以轻松切换状态对象,从而改变对象的行为。

状态模式的好处

  1. 封装状态转换

    • 将状态转换的逻辑封装到状态类内部,使得状态之间的切换变得明确和集中。每个状态类只负责处理该状态下的行为和状态切换的逻辑,避免了分散在多个类中的状态转换代码。
  2. 简化复杂条件逻辑

    • 通过将不同状态的行为分散到不同的状态类中,消除了大量的条件语句(如if-elseswitch-case),使得代码更加简洁和可读。状态模式避免了庞大的条件逻辑,减少了代码复杂度。
  3. 提高可维护性

    • 每个状态类只包含与该状态相关的行为和转换逻辑,修改或添加状态时,只需修改或添加相应的状态类,不需要修改其他状态类或上下文类。这种模块化设计使得系统更容易维护和扩展。
  4. 增强可扩展性

    • 状态模式使得增加新状态变得容易。新状态只需实现状态接口并定义其行为和转换逻辑,不需要改动现有代码。状态模式提供了良好的扩展性。
  5. 符合单一职责原则

    • 每个状态类只负责管理一个特定状态下的行为和转换逻辑,符合单一职责原则(SRP)。这种设计使得每个类的职责更加明确和单一,代码更加清晰和易于理解。
  6. 状态的显式表示

    • 状态模式通过将状态表示为独立的类,使得状态成为显式的概念。这种显式表示有助于理解和调试系统的状态变化过程,增强了代码的可读性和可维护性。
  7. 更好的对象行为控制

    • 状态模式将与状态相关的行为封装到状态类中,使得行为控制更加集中和明确。对象在不同状态下的行为变化变得清晰且易于管理。

例子:电梯系统

考虑一个简单的电梯系统,它有三种状态:静止状态、上升状态和下降状态。电梯在不同状态下的行为(如启动、停止、上升、下降等)是不同的。使用状态模式来实现这个系统:

状态接口

interface ElevatorState {
    void start(ElevatorContext context);
    void stop(ElevatorContext context);
    void moveUp(ElevatorContext context);
    void moveDown(ElevatorContext context);
}

具体状态类

class StoppedState implements ElevatorState {
    @Override
    public void start(ElevatorContext context) {
        System.out.println("Elevator starting...");
        context.setState(new MovingUpState());
    }

    @Override
    public void stop(ElevatorContext context) {
        System.out.println("Elevator is already stopped.");
    }

    @Override
    public void moveUp(ElevatorContext context) {
        System.out.println("Elevator moving up...");
        context.setState(new MovingUpState());
    }

    @Override
    public void moveDown(ElevatorContext context) {
        System.out.println("Elevator moving down...");
        context.setState(new MovingDownState());
    }
}

class MovingUpState implements ElevatorState {
    @Override
    public void start(ElevatorContext context) {
        System.out.println("Elevator is already moving up.");
    }

    @Override
    public void stop(ElevatorContext context) {
        System.out.println("Elevator stopping...");
        context.setState(new StoppedState());
    }

    @Override
    public void moveUp(ElevatorContext context) {
        System.out.println("Elevator is already moving up.");
    }

    @Override
    public void moveDown(ElevatorContext context) {
        System.out.println("Elevator cannot move down while moving up.");
    }
}

class MovingDownState implements ElevatorState {
    @Override
    public void start(ElevatorContext context) {
        System.out.println("Elevator is already moving down.");
    }

    @Override
    public void stop(ElevatorContext context) {
        System.out.println("Elevator stopping...");
        context.setState(new StoppedState());
    }

    @Override
    public void moveUp(ElevatorContext context) {
        System.out.println("Elevator cannot move up while moving down.");
    }

    @Override
    public void moveDown(ElevatorContext context) {
        System.out.println("Elevator is already moving down.");
    }
}

电梯上下文类

class ElevatorContext {
    private ElevatorState state;

    public ElevatorContext() {
        state = new StoppedState(); // 初始状态
    }

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

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

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

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

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

使用状态模式

public class Main {
    public static void main(String[] args) {
        ElevatorContext elevator = new ElevatorContext();

        elevator.start();     // 输出: Elevator starting...
                              // 输出: Elevator moving up...
        elevator.moveUp();    // 输出: Elevator is already moving up.
        elevator.stop();      // 输出: Elevator stopping...
        elevator.moveDown();  // 输出: Elevator moving down...
                              // 输出: Elevator is already moving down.
        elevator.stop();      // 输出: Elevator stopping...
    }
}

状态模式通过将对象的状态和行为封装到独立的状态类中,实现了状态和行为的解耦。它降低了复杂条件逻辑,增强了代码的可维护性和可扩展性,使得状态转换和行为控制更加明确和集中。状态模式特别适用于需要根据状态变化动态改变行为的场景,如游戏开发中的角色状态管理、工作流系统中的任务状态管理等。

标签:状态,void,模式,ElevatorContext,好处,Elevator,context,public
From: https://www.cnblogs.com/gongchengship/p/18284832

相关文章

  • VMware开启CentOS Stream 9操作系统提示 “此主机支持 Intel VT-x,但 Intel VT-x 处于
    解决步骤:1.重启电脑2.华硕主板按(F2或DEL)键进入BIOS3.进入高级->CPU设置4.下拉,InterVirtualizationTechnology开启5.退出->保存改动参考网址:https://blog.csdn.net/web22050702/article/details/138712829......
  • vue项目中使用AES实现密码加密解密ECB和CBC模式)
    ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准) 1.先安装crypto-......
  • 【ESP32】打造全网最强esp-idf基础教程——15.WiFi连接STA模式
    WiFi连接STA模式一、ESP32的WiFi功能介绍    前面章节内容,基本上都是描述了ESP32强大的MCU能力,这些MCU能力使得ESP32可以替换许多类型的单片机工作,而自己承担这部分功能;当然ESP32的IOT能力才是它的主业,从硬件配置来看,ESP32支持2.4GHz频段WiFi+BT(LE)4.2,而esp-idf对WiFi......
  • 以银行卡取钱的流程为例的状态模式的 java 的 demo
    好的,下面我们将用状态模式来实现一个模拟从银行卡取钱的流程。假设我们有以下几个状态:输入卡输入密码选择操作取款取卡我们通过状态模式来实现这些状态之间的切换。状态接口首先,我们定义一个状态接口ATMState://ATMState.javapublicinterfaceATMState{void......
  • JavaScript中的异步模式
    JavaScript中的异步模式JavaScript语言的执行环境是“单线程(singlethread)”,就是指一次只能完成一个任务。如果有多个任务,就必须排队,等前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯,坏处是只要有一个任务耗时很长,后面的任务......
  • 状态模式的精髓是什么
    状态模式(StatePattern)的精髓在于将对象的行为包装在状态对象中,并通过状态对象改变对象的行为。它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了其类。核心思想状态封装:将不同状态下的行为封装到不同的状态类中,避免了大量的条件语句(如if或switch)。状......
  • 如何启动一个 server 模式的 h2 数据库
    要启动一个server模式的H2数据库,可以按照以下步骤操作:准备工作下载H2数据库:首先,您需要从H2数据库的官方网站下载H2数据库的JAR文件。访问H2DatabaseEngine并下载最新版本的h2-x.x.x.jar文件。Java环境:确保您的计算机上安装了Java环境(JRE或JDK),并配......
  • 设计模式-设计原则与设计模式总结
    设计原则,是设计模式的基础。在实际开发中,并不是一定要求所有代码都遵循设计原则,我们需要综合考虑人力、时间、成本、质量,不是可以追求完美,要在设当的场景遵循合适的设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。设计模式(DesignPattern)是前辈们经过相当长的......
  • 设计模式-访问者模式
    访问者模式访问者模式(VisitorPattern)是一种将数据结构与数据操作分离的设计模式,是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作,属于行为型模式。访问者模式被称为最复杂的设计模式,但是使用率不高。不过,一旦你需要......
  • 香橙派 AIpro搭建1Panel运维管理面板实现高效直观的设备状态监控
    ......