Java实现状态模式的示例代码

 更新时间:2025年02月11日 08:23:36   作者:new666999  
状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

一、简介

1、定义

状态模式 (State Pattern)是一种行为型设计模式,允许对象在内部状态改变时改变它的行为。通过定义状态接口和具体状态类,将对象的状态和行为分开,使得状态改变时可以改变行为。

2、状态模式的结构

状态模式涉及以下几个角色:
State(状态接口):定义了状态类的共同接口,所有具体的状态类都实现这个接口。
ConcreteState(具体状态类):每个具体的状态类实现了State接口,并定义了在该状态下的具体行为。
Context(上下文):上下文类维护一个当前状态的引用,它通常会委托给具体的状态类来执行相应的状态切换。

二、Java实现案例

1、电灯开关状态案例

/**
 * @Description: 状态接口
 * @Date: 2025-02-07 17:09
 * @Author: gaoyufei
 **/
public interface State {
    void handle(Switch context);
}

/**
 * @Description: 关灯状态
 * @Date: 2025-02-07 17:12
 * @Author: gaoyufei
 **/
public class CloseState implements State{
    @Override
    public void handle(Switch switcher) {
        switcher.setState(new OpenState());
        System.out.println("开灯了");
    }
}
/**
 * @Description: 开灯状态
 * @Date: 2025-02-07 17:11
 * @Author: gaoyufei
 **/
public class OpenState implements State{
    @Override
    public void handle(Switch switcher) {
        switcher.setState(new CloseState());
        System.out.println("关灯了");
    }
}
/**
 * @Description: 开关,持有灯的状态
 * @Date: 2025-02-07 17:08
 * @Author: gaoyufei
 **/
public class Switch {
    private State state;
    public Switch(State state){
        this.state=state;
    }
    public void setState(State state){
        this.state=state;
    }
    public void press(){
        state.handle(this);
    }
}

/**
 * @Description: 操作人
 * @Date: 2025-02-07 17:14
 * @Author: gaoyufei
 **/
public class Operator {
    public static void main(String[] args) throws InterruptedException {
        Switch switcher=new Switch(new CloseState());//初始状态是关灯
        //模拟每隔1秒按压一下开关
        while (true){
            Thread.sleep(1000);
            switcher.press();
        }
    }
}

2、番茄工作法状态案例

/**
 * @Description: 番茄状态接口
 * @Date: 2025-02-08 10:49
 * @Author: gaoyufei
 **/
public interface TomatoState {
    void deal(Worker worker);
}

/**
 * @Description: 番茄-工作状态类
 * @Date: 2025-02-08 10:51
 * @Author: gaoyufei
 **/
public class WorkTomatoState implements TomatoState {
    @Override
    public void deal(Worker worker) {
        System.out.println("休息结束了,开始工作吧");
        try {
            Thread.sleep(25*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("工作了25分钟");
        worker.setTomatoState(new RestTomatoState());
    }
}

/**
 * @Description: 番茄-休息状态类
 * @Date: 2025-02-08 10:53
 * @Author: gaoyufei
 **/
public class RestTomatoState implements TomatoState{
    @Override
    public void deal(Worker worker) {
        System.out.println("工作结束了,好好休息吧");
        try {
            Thread.sleep(5*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("休息了5分钟");
        worker.setTomatoState(new WorkTomatoState());
    }
}

/**
 * @Description: 工作者
 * @Date: 2025-02-08 10:51
 * @Author: gaoyufei
 **/
public class Worker {
    private TomatoState tomatoState;
    public Worker(TomatoState tomatoState){
        this.tomatoState=tomatoState;
    }
    public void setTomatoState(TomatoState tomatoState){
        this.tomatoState=tomatoState;
    }
    public void startTomatoClock(){
        this.tomatoState.deal(this);
    }
}

/**
 * @Description: 客户端
 * @Date: 2025-02-08 11:02
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        Worker worker=new Worker(new WorkTomatoState());
        while (true){
            worker.startTomatoClock();
        }
    }
}

3、电梯状态案例

这是一个简单的电梯系统。电梯的状态有关门、开门、上升、下降、停止。每个状态下电梯的行为不同。通过状态模式,根据电梯的不同状态执行不同的行为。

/**
 * @Description: 电梯状态接口
 * @Date: 2025-02-08 9:02
 * @Author: gaoyufei
 **/
public interface ElevatorState {
    void openDoor();
    void closeDoor();
    void moveUp();
    void moveDown();
    void stop();
}
/**
 * @Description: 关门状态
 * @Date: 2025-02-08 9:05
 * @Author: gaoyufei
 **/
public class CloseState implements ElevatorState {
    private Elevator elevator;
    public CloseState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯门开了");
        elevator.setCurrentState(elevator.getOpenState());
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯门已经关了");
    }
    @Override
    public void moveUp() {
        System.out.println("电梯上升");
        elevator.setCurrentState(elevator.getMovingUpState());
    }
    @Override
    public void moveDown() {
        System.out.println("电梯下降");
        elevator.setCurrentState(elevator.getMovingDownState());
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
        elevator.setCurrentState(elevator.getStopState());
    }
}

/**
 * @Description: 开门状态
 * @Date: 2025-02-08 9:07
 * @Author: gaoyufei
 **/
public class OpenState implements ElevatorState{
    private Elevator elevator;
    public OpenState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯门已经打开");
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯门关了");
        elevator.setCurrentState(elevator.getCloseState());
    }
    @Override
    public void moveUp() {
        System.out.println("电梯门打开状态,不能上升");
    }
    @Override
    public void moveDown() {
        System.out.println("电梯门打开状态,不能下降");
    }
    @Override
    public void stop() {
        System.out.println("电梯门打开状态,不能变换为停止状态");
    }
}

/**
 * @Description: 停止状态
 * @Date: 2025-02-08 9:59
 * @Author: gaoyufei
 **/
public class StopState implements ElevatorState{
    private Elevator elevator;
    public StopState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯门开了");
        elevator.setCurrentState(elevator.getOpenState());
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯门关了");
        elevator.setCurrentState(elevator.getCloseState());
    }
    @Override
    public void moveUp() {
        System.out.println("电梯上升");
        elevator.setCurrentState(elevator.getMovingUpState());
    }
    @Override
    public void moveDown() {
        System.out.println("电梯下降");
        elevator.setCurrentState(elevator.getMovingDownState());
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
    }
}
/**
 * @Description: 上升状态
 * @Date: 2025-02-08 9:07
 * @Author: gaoyufei
 **/
public class MovingUpState implements ElevatorState{
    private Elevator elevator;
    public MovingUpState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯正在上升,不能开门");
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯已经关门");
    }
    @Override
    public void moveUp() {
        System.out.println("电梯正在上升");
    }
    @Override
    public void moveDown() {
        System.out.println("电梯下降");
        elevator.setCurrentState(elevator.getMovingDownState());
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
        elevator.setCurrentState(elevator.getStopState());
    }
}

/**
 * @Description: 下降状态
 * @Date: 2025-02-08 9:08
 * @Author: gaoyufei
 **/
public class MovingDownState implements ElevatorState{
    private Elevator elevator;
    public MovingDownState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯正在下降,不能开门");
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯正在下降,已经关门了");
    }
    @Override
    public void moveUp() {
        System.out.println("电梯上升");
        elevator.setCurrentState(elevator.getMovingUpState());
    }
    @Override
    public void moveDown() {
        System.out.println("电梯正在下降");
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
        elevator.setCurrentState(elevator.getStopState());
    }
}

/**
 * @Description: 电梯
 * @Date: 2025-02-08 9:04
 * @Author: gaoyufei
 **/
public class Elevator {
    private ElevatorState closeState;
    private ElevatorState openState;
    private ElevatorState movingDownState;
    private ElevatorState movingUpState;
    private ElevatorState stopState;

    private ElevatorState currentState;

    public Elevator(){
        closeState=new CloseState(this);
        openState=new OpenState(this);
        movingDownState=new MovingDownState(this);
        movingUpState=new MovingUpState(this);
        stopState=new StopState(this);
        currentState=closeState;// 默认初始状态为关闭状态

    }
    public void setCurrentState(ElevatorState currentState) {
        this.currentState = currentState;
    }
    public ElevatorState getCloseState() {
        return closeState;
    }
    public ElevatorState getOpenState() {
        return openState;
    }
    public ElevatorState getMovingDownState() {
        return movingDownState;
    }
    public ElevatorState getMovingUpState() {
        return movingUpState;
    }
    public ElevatorState getStopState() {
        return stopState;
    }
    public void openDoor(){
        currentState.openDoor();
    }
    public void closeDoor(){
        currentState.closeDoor();
    }
    public void moveUp(){
        currentState.moveUp();
    }
    public void moveDown(){
        currentState.moveDown();
    }
    public void stop(){
        currentState.stop();
    }
}

/**
 * @Description: 客户端
 * @Date: 2025-02-08 9:29
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        //初始关闭状态
        Elevator elevator=new Elevator();
        //关门
        elevator.closeDoor();//输出 电梯门已经关了
        //开门
        elevator.openDoor();//输出 电梯门开了
        //上升
        elevator.moveUp();//输出 电梯门打开状态不能上升
        //关门
        elevator.closeDoor();//输出 电梯门关了
        //上升
        elevator.moveUp();//输出 电梯上升
        //关门
        elevator.closeDoor();//输出 电梯已经关门
        //下降
        elevator.moveDown();//输出 电梯下降
        //停止
        elevator.stop();//输出 电梯停止
        //开门
        elevator.openDoor();//输出 电梯门开了
        //停止
        elevator.stop();//输出 电梯门打开状态,不能变换为停止状态
    }
}

到此这篇关于Java实现状态模式的示例代码的文章就介绍到这了,更多相关Java 状态模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何优雅替换if-else语句

    Java如何优雅替换if-else语句

    当逻辑分支非常多的时候,if-else套了一层又一层,那么如何干掉过多的if-else,本文就详细的介绍一下,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java Management Extensions管理扩展原理解析

    Java Management Extensions管理扩展原理解析

    这篇文章主要介绍了Java Management Extensions管理扩展原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用Java Executors创建线程池的9种方法

    使用Java Executors创建线程池的9种方法

    文章主要介绍了 Java 中Executors类创建线程池的 9 种方法,每种方法都详细阐述了实现原理、源代码分析、参数解释、实现过程、特性和使用场景,感兴趣的小伙伴跟着小编一起来看看吧
    2024-11-11
  • Maven配置仓库、阿里云镜像、环境变量(史上最全)

    Maven配置仓库、阿里云镜像、环境变量(史上最全)

    本文主要介绍了Maven配置仓库、阿里云镜像、环境变量,文中通过图文示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • SpringBoot整合gateway全过程

    SpringBoot整合gateway全过程

    这篇文章主要介绍了SpringBoot整合gateway全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Springboot RestTemplate设置超时时间的简单方法

    Springboot RestTemplate设置超时时间的简单方法

    学习springboot ,RestTemplate的使用场景非常非常多,比如springcloud中的服务消费,下面这篇文章主要给大家介绍了关于Springboot RestTemplate设置超时时间的简单方法,需要的朋友可以参考下
    2022-01-01
  • Java使用String.format方法格式化字符串的示例详解

    Java使用String.format方法格式化字符串的示例详解

    在编程过程中,我们经常需要创建格式化的字符串来满足特定的需求,比如生成用户友好的消息、构建报告或是输出调试信息,Java 提供了一个强大的工具——String.format 方法,本文给大家介绍了Java使用String.format方法格式化字符串的示例,需要的朋友可以参考下
    2024-11-11
  • Mybatis-Plus中updateById方法不能更新空值问题解决

    Mybatis-Plus中updateById方法不能更新空值问题解决

    本文主要介绍了Mybatis-Plus中updateById方法不能更新空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • IDEA 中创建Spring Data Jpa 项目的示例代码

    IDEA 中创建Spring Data Jpa 项目的示例代码

    这篇文章主要介绍了IDEA 中创建Spring Data Jpa 项目的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • SpringMVC文件上传的配置实例详解

    SpringMVC文件上传的配置实例详解

    本文通过实例代码给大家介绍SpringMVC文件上传的配置相关内容,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-05-05

最新评论