首页 > 其他分享 >行为型模式-状态模式

行为型模式-状态模式

时间:2024-06-19 09:00:37浏览次数:14  
标签:状态 void System 模式 println 行为 public out

状态模式模式是什么

    状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。在状态模式中,对象的行为是基于当前状态来决定的,对象会根据不同的状态来执行不同的操作。这样可以将复杂的状态逻辑封装在具体的状态类中,使得代码更加可维护、可扩展,并且符合开闭原则。

在状态模式中,有三个核心角色:

  1. 环境类(Context):持有一个具体状态类的实例,用于维护当前状态,并提供对外的接口来改变状态。

  2. 抽象状态类(State):定义了一个接口,用于封装具体状态类的行为。

  3. 具体状态类(ConcreteState):实现了抽象状态类的接口,在不同的状态下具有不同的行为。

状态模式优缺点

优点:

  1. 将状态的逻辑封装在具体的状态类中,使得状态的变化更加清晰可见,易于理解和维护。
  2. 增加新的状态类或修改现有状态类不会影响到其他状态类,符合开闭原则。
  3. 避免了大量的条件语句判断状态,提高代码的可读性和可维护性。
  4. 可以将状态转换逻辑集中化,减少代码的冗余。

缺点:

  1. 如果状态类较多,可能会导致类的数量增加,增加代码的复杂性。
  2. 如果状态之间的转换逻辑较为复杂,可能导致状态类的设计变得复杂。
  3. 状态模式可能会增加一些类和对象的数量,增加了系统的复杂性。

状态模式应用场景

  1. 对象的行为取决于它的状态,并且需要在运行时根据状态改变行为。
  2. 对象的行为包含大量的条件判断语句,并且这些条件判断语句随着状态的不同而变化。
  3. 对象的行为需要根据状态的改变而改变,但是并不希望将状态的变化和行为的实现混在一起。

例如,考虑一个交通信号灯的控制系统。信号灯有红灯、黄灯和绿灯三种状态。状态模式可以用来处理信号灯不同状态下的行为。在红灯状态下,信号灯只能显示红灯,车辆必须停下;在黄灯状态下,信号灯只能显示黄灯,车辆准备停下;在绿灯状态下,信号灯只能显示绿灯,车辆可以通行。通过使用状态模式,可以将不同状态的行为封装在不同的状态类中,使得代码更加清晰和可维护。

代码示例

// 定义电梯状态接口
interface ElevatorState {
    void openDoor();
    void closeDoor();
    void goUp();
    void goDown();
}

// 电梯关闭状态类
class ClosedState implements ElevatorState {
    @Override
    public void openDoor() {
        System.out.println("Opening door...");
        // 切换到开门状态
        ElevatorContext.getInstance().changeState(new OpenedState());
    }

    @Override
    public void closeDoor() {
        System.out.println("Door is already closed");
    }

    @Override
    public void goUp() {
        System.out.println("Going up...");
        // 切换到上升状态
        ElevatorContext.getInstance().changeState(new GoingUpState());
    }

    @Override
    public void goDown() {
        System.out.println("Going down...");
        // 切换到下降状态
        ElevatorContext.getInstance().changeState(new GoingDownState());
    }
}

// 电梯开门状态类
class OpenedState implements ElevatorState {
    @Override
    public void openDoor() {
        System.out.println("Door is already opened");
    }

    @Override
    public void closeDoor() {
        System.out.println("Closing door...");
        // 切换到关闭状态
        ElevatorContext.getInstance().changeState(new ClosedState());
    }

    @Override
    public void goUp() {
        System.out.println("Cannot go up while door is opened");
    }

    @Override
    public void goDown() {
        System.out.println("Cannot go down while door is opened");
    }
}

// 电梯上升状态类
class GoingUpState implements ElevatorState {
    @Override
    public void openDoor() {
        System.out.println("Cannot open door while going up");
    }

    @Override
    public void closeDoor() {
        System.out.println("Cannot close door while going up");
    }

    @Override
    public void goUp() {
        System.out.println("Already going up");
    }

    @Override
    public void goDown() {
        System.out.println("Going down...");
        // 切换到下降状态
        ElevatorContext.getInstance().changeState(new GoingDownState());
    }
}

// 电梯下降状态类
class GoingDownState implements ElevatorState {
    @Override
    public void openDoor() {
        System.out.println("Cannot open door while going down");
    }

    @Override
    public void closeDoor() {
        System.out.println("Cannot close door while going down");
    }

    @Override
    public void goUp() {
        System.out.println("Going up...");
        // 切换到上升状态
        ElevatorContext.getInstance().changeState(new GoingUpState());
    }

    @Override
    public void goDown() {
        System.out.println("Already going down");
    }
}

// 电梯上下文类
class ElevatorContext {
    private ElevatorState currentState;
    private static ElevatorContext instance;

    private ElevatorContext() {
        // 初始状态为关闭状态
        currentState = new ClosedState();
    }

    public static ElevatorContext getInstance() {
        if (instance == null) {
            instance = new ElevatorContext();
        }
        return instance;
    }

    public void changeState(ElevatorState state) {
        currentState = state;
    }

    public void openDoor() {
        currentState.openDoor();
    }

    public void closeDoor() {
        currentState.closeDoor();
    }

    public void goUp() {
        currentState.goUp();
    }

    public void goDown() {
        currentState.goDown();
    }
}

// 示例代码
public class Main {
    public static void main(String[] args) {
        ElevatorContext elevator = ElevatorContext.getInstance();

        // 电梯初始状态为关闭状态
        elevator.closeDoor();

        // 电梯开始上升
        elevator.goUp();

        // 电梯开门
        elevator.openDoor();

        // 电梯关闭门
        elevator.closeDoor();

        // 电梯开始下降
        elevator.goDown();
    }
}

这段代码使用了状态模式来模拟电梯的行为。电梯有四个状态:关闭、开门、上升和下降。每个状态实现了相应的操作方法。ElevatorContext类负责管理电梯的状态,并在状态切换时调用相应的方法。主函数中演示了电梯的各种操作。

总结

    

状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。状态模式将对象的行为封装在不同的状态类中,对象根据其当前状态决定采取的行动。

在状态模式中,通常有三个主要角色:上下文(Context),抽象状态(Abstract State)和具体状态(Concrete State)。

上下文(Context)是包含状态的对象,它可以根据其当前状态来执行相应的行为。上下文可以将请求委派给具体状态对象,同时也可以在状态之间切换。

抽象状态(Abstract State)是所有具体状态类的基类,它定义了一个接口,用于在具体状态类中实现不同的行为。

具体状态(Concrete State)是实现抽象状态接口的具体类,每个具体状态类都对应于上下文的一个状态,当上下文的状态改变时,具体状态类的行为也会相应改变。

状态模式的核心思想是将复杂的条件判断逻辑分散到各个状态类中,使得每个状态类的代码更加简洁和可维护。同时,状态模式也提供了一种简单的方法来扩展和添加新的状态,而不需要修改上下文类的代码。

使用状态模式可以带来如下好处:

  1. 将与特定状态相关的行为局部化,并将不同状态的行为分散到各个具体状态类中,提高代码的可读性和可维护性。

  2. 通过定义新的具体状态类来扩展状态,不需要修改上下文类的代码。

  3. 状态模式符合开闭原则,能够轻松添加新的状态类,而无需修改现有代码。

状态模式的缺点是会增加类和对象的数量,因为每个具体状态类都需要一个对应的类。同时,状态模式也可能增加了系统的复杂性。

标签:状态,void,System,模式,println,行为,public,out
From: https://blog.csdn.net/Flying_Fish_roe/article/details/139551212

相关文章

  • EtherCAT主站SOEM -- 44 -- win-vs-soem-win10及win11系统VisualStudio-SOEM-控制电机
    EtherCAT主站SOEM--44--win-vs-soem-win10及win11系统VisualStudio-SOEM-控制电机走周期同步位置模式(CSP模式)0QT-SOEM及STM32F767-SOEM视频欣赏及源代码链接:0.1Linux--Ubuntu系统之QT-SOEM博客、视频欣赏及源代码链接0.2STM32F767-SOEM博客、视频欣赏及源......
  • 【状态估计】非线性受控动力系统的线性预测器——Koopman模型预测MPC(Matlab代码实现)
     ......
  • 线程的状态,中断及守护线程
    线程的状态在Java程序中,一个线程对象只能调用一次start()方法启动新线程,并在新线程中执行run()方法。一旦run()方法执行完毕,线程就结束了。因此,Java线程的状态有以下几种:New:新创建的线程,尚未执行;Runnable:运行中的线程,正在执行run()方法的Java代码;Blocked:运行中的线程,因为某......
  • python文件操作、文件操作、读写文件、写模式
    with读取文件数据内容withopen(filepath,mode,encoding)asfile:#具体操作,例如:print(file.read())#查看文件所有的内容。with:Python中的一个上下文管理器,用于简化资源的管理和释放。它可以用于任意需要进行资源分配和释放的情境,比如文件操作、数据库连......
  • 设计模式——单例模式
    单例模式(Singleton)单例模式是一种创建型设计模式,保证一个类只有一个实例,并提供一个访问它的全局访问点单例模式解决了两个问题:保证一个类只有一个实例。控制类的实例数量的常见原因是控制某些共享资源(例如数据库或文件)的访问权限。为该实例提供一个全局访问节点。......
  • C# 模式匹配
    C#模式匹配https://www.geeksforgeeks.org/pattern-matching-in-c-sharp/https://www.codeproject.com/Articles/5368148/Your-Quick-Guide-to-Pattern-Matching-in-Csharp什是模式匹配模式匹配是一种在代码中识别和提取数据的机制。它允许您以声明式的方式检查对象的形状......
  • 设计模式-策略模式
    策略模式策略模式,又叫政策模式,它是将定义的算法家族分别封装起来,让他们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户,属于行为型模式。角色:上下文角色(Context):用来操作策略的上下文环境,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化。抽象策略角色(Strateg......
  • Golang与设计模式
    单例模式因为之前研究Java比较多,所以当我试着使用go来实现一些设计模式的时候,首先想到的就是照搬Java中的思路,后面对go了解加深之后又增加了一些新的思路。在Java中实现的单例模式的思路有很多,但是比较好的两个思路是利用类加载机制生成单例对象,check-lock-check机制避免并发问......
  • Ps:条件模式更改
    Ps菜单:文件/自动/条件模式更改Automate/ConditionalModeChange条件模式更改 ConditionalModeChange脚本命令可用于将图像文档的颜色模式更改为指定的模式。既可以将指定的源颜色模式转换为目标颜色模式,还可以将此命令记录在动作中以便实施快速转换。◆  ◆  ◆......
  • 华为AR系列路由器ipv6 有状态dhcpv6注意事项
    问题:近期家用宽带某通的ipv6剧烈变动,原本一周都不变的前缀现在一天都要变,然后局域网内linux设备更新地址较为迟缓,经常出现前缀更新但主机未更新,导致路由失效,无法连接的故障。分析:华为AR路由的dhcpv6地址分配中有有效时间、首选时间的参数,有效时间表示不更新前缀的主机必须下线......