Java实现状态模式

devtools/2025/2/12 2:47:08/

一、简介

1、定义

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

2、状态模式的结构

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

二、Java实现案例

1、电灯开关状态案例

java">/*** @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{@Overridepublic 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{@Overridepublic 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、番茄工作法状态案例

java">/*** @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 {@Overridepublic 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{@Overridepublic 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、电梯状态案例

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

java">/*** @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;}@Overridepublic void openDoor() {System.out.println("电梯门开了");elevator.setCurrentState(elevator.getOpenState());}@Overridepublic void closeDoor() {System.out.println("电梯门已经关了");}@Overridepublic void moveUp() {System.out.println("电梯上升");elevator.setCurrentState(elevator.getMovingUpState());}@Overridepublic void moveDown() {System.out.println("电梯下降");elevator.setCurrentState(elevator.getMovingDownState());}@Overridepublic 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;}@Overridepublic void openDoor() {System.out.println("电梯门已经打开");}@Overridepublic void closeDoor() {System.out.println("电梯门关了");elevator.setCurrentState(elevator.getCloseState());}@Overridepublic void moveUp() {System.out.println("电梯门打开状态,不能上升");}@Overridepublic void moveDown() {System.out.println("电梯门打开状态,不能下降");}@Overridepublic 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;}@Overridepublic void openDoor() {System.out.println("电梯门开了");elevator.setCurrentState(elevator.getOpenState());}@Overridepublic void closeDoor() {System.out.println("电梯门关了");elevator.setCurrentState(elevator.getCloseState());}@Overridepublic void moveUp() {System.out.println("电梯上升");elevator.setCurrentState(elevator.getMovingUpState());}@Overridepublic void moveDown() {System.out.println("电梯下降");elevator.setCurrentState(elevator.getMovingDownState());}@Overridepublic 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;}@Overridepublic void openDoor() {System.out.println("电梯正在上升,不能开门");}@Overridepublic void closeDoor() {System.out.println("电梯已经关门");}@Overridepublic void moveUp() {System.out.println("电梯正在上升");}@Overridepublic void moveDown() {System.out.println("电梯下降");elevator.setCurrentState(elevator.getMovingDownState());}@Overridepublic 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;}@Overridepublic void openDoor() {System.out.println("电梯正在下降,不能开门");}@Overridepublic void closeDoor() {System.out.println("电梯正在下降,已经关门了");}@Overridepublic void moveUp() {System.out.println("电梯上升");elevator.setCurrentState(elevator.getMovingUpState());}@Overridepublic void moveDown() {System.out.println("电梯正在下降");}@Overridepublic 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();//输出 电梯门打开状态,不能变换为停止状态}
}

http://www.ppmy.cn/devtools/158085.html

相关文章

Linux 僵尸进程与孤儿进程

Linux 僵尸进程与孤儿进程 1. 僵尸进程 (Zombie Process)1.1 什么是僵尸进程1.2 僵尸进程的产生1.3 僵尸进程的危害1.4 如何处理僵尸进程 2. 孤儿进程 (Orphan Process)2.1 什么是孤儿进程2.2 孤儿进程的特点2.3 孤儿进程的应用 在 Linux 系统中,进程是资源分配和调…

【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案

建筑设计公司在项目执行过程中,会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求:为了方便内部管理和向客户交付完整的设计方案,公司需要将每个项目文件…

我准备做一个24H的摄像机模拟器,用录像视频模拟实时画面,如果能支持时间水印就更好了

之前我不是搞了一个摄像机模拟器吗《用EasyRTSPServer模拟摄像机RTSP流实现RTSP摄像机模拟器 》,搞的比较简单,就是用视频文件模拟摄像机的画面,那个只能简单用来做个IPC模拟,给开发者用用或者给调研的人看看可行性,实…

Transformer基础 多头自注意力机制

# 1. **自注意力机制**:Transformer通过自注意力机制能够高效地计算序列内所有元素之间的关系,这使得模型能够捕捉到长距离依赖,无论这些依赖的距离有多远。 # 2. **并行化处理**:与RNN不同,Transformer可以同时处理整…

如何使用Socket编程在Python中实现实时聊天应用

在现代的网络应用中,实时聊天功能成为了不可或缺的一部分。从社交平台到在线客服系统,实时聊天应用广泛存在。Python提供了强大的socket库,可以帮助我们轻松实现基于TCP协议的实时聊天功能。本文将介绍如何通过Socket编程在Python中实现一个简…

Git―分支管理

Git ⛅创建&切换&合并分支⛅删除分支⛅合并冲突⛅合并模式⛅Bug 分支⛅强制删除分支 master → 主分支 # 查看本地所有分支 git branch分支前面的*, 代表当前所在的分支 图中当前所在的分支为master ⛅创建&切换&合并分支 # 创建分支 git branch "bra…

Spring框架学习大纲

Spring框架学习大纲 一、Spring基础入门 Spring概述 Spring框架发展历史与核心优势Spring核心模块组成(IoC、AOP、Data Access、Web MVC等)Spring与传统Java EE开发对比 控制反转(IoC)与依赖注入(DI) IoC…

贪心算法_翻硬币

蓝桥账户中心 依次遍历 不符合条件就反转 题目要干嘛 你就干嘛 #include <bits/stdc.h>#define endl \n using namespace std;int main() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin >> s;string t; cin >> t;int ret 0;for ( i…