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

2025-02-11 17:50

本文主要是介绍Java实现状态模式的示例代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了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(TomatoSChina编程tate 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、电梯状态案例

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

/**
 * @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: js停止状态
 * @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 c编程urrentState;

    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: 客户端
 php* @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 状态模式内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Java实现状态模式的示例代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153400

相关文章

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma