设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间22 现在时间22 缓存数据 关关难过关关过,夜夜难熬夜夜熬。万般皆苦,悲欢自渡,他人难悟。晚安!

关关难过关关过,夜夜难熬夜夜熬。万般皆苦,悲欢自渡,他人难悟。晚安!

查看: 1277|回复: 1

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:220
  • 打卡月天数:0
  • 打卡总奖励:3421
  • 最近打卡:2025-08-22 03:51:59
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
394
主题
385
精华
0
金钱
4624
积分
829
注册时间
2023-1-24
最后登录
2025-8-22

发表于 2025-2-12 23:39:58 | 显示全部楼层 |阅读模式
目录
  • 一、简介
    • 1、定义
    • 2、状态模式的结构
  • 二、Java实现案例
    • 1、电灯开关状态案例
    • 2、番茄工作法状态案例
    • 3、电梯状态案例

一、简介

1、定义

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

2、状态模式的结构

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

二、Java实现案例

1、电灯开关状态案例

  1. /**
  2. * @Description: 状态接口
  3. * @Date: 2025-02-07 17:09
  4. * @Author: gaoyufei
  5. **/
  6. public interface State {
  7. void handle(Switch context);
  8. }
  9. /**
  10. * @Description: 关灯状态
  11. * @Date: 2025-02-07 17:12
  12. * @Author: gaoyufei
  13. **/
  14. public class CloseState implements State{
  15. @Override
  16. public void handle(Switch switcher) {
  17. switcher.setState(new OpenState());
  18. System.out.println("开灯了");
  19. }
  20. }
  21. /**
  22. * @Description: 开灯状态
  23. * @Date: 2025-02-07 17:11
  24. * @Author: gaoyufei
  25. **/
  26. public class OpenState implements State{
  27. @Override
  28. public void handle(Switch switcher) {
  29. switcher.setState(new CloseState());
  30. System.out.println("关灯了");
  31. }
  32. }
  33. /**
  34. * @Description: 开关,持有灯的状态
  35. * @Date: 2025-02-07 17:08
  36. * @Author: gaoyufei
  37. **/
  38. public class Switch {
  39. private State state;
  40. public Switch(State state){
  41. this.state=state;
  42. }
  43. public void setState(State state){
  44. this.state=state;
  45. }
  46. public void press(){
  47. state.handle(this);
  48. }
  49. }
  50. /**
  51. * @Description: 操作人
  52. * @Date: 2025-02-07 17:14
  53. * @Author: gaoyufei
  54. **/
  55. public class Operator {
  56. public static void main(String[] args) throws InterruptedException {
  57. Switch switcher=new Switch(new CloseState());//初始状态是关灯
  58. //模拟每隔1秒按压一下开关
  59. while (true){
  60. Thread.sleep(1000);
  61. switcher.press();
  62. }
  63. }
  64. }
复制代码

2、番茄工作法状态案例

  1. /**
  2. * @Description: 番茄状态接口
  3. * @Date: 2025-02-08 10:49
  4. * @Author: gaoyufei
  5. **/
  6. public interface TomatoState {
  7. void deal(Worker worker);
  8. }
  9. /**
  10. * @Description: 番茄-工作状态类
  11. * @Date: 2025-02-08 10:51
  12. * @Author: gaoyufei
  13. **/
  14. public class WorkTomatoState implements TomatoState {
  15. @Override
  16. public void deal(Worker worker) {
  17. System.out.println("休息结束了,开始工作吧");
  18. try {
  19. Thread.sleep(25*60*1000);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. System.out.println("工作了25分钟");
  24. worker.setTomatoState(new RestTomatoState());
  25. }
  26. }
  27. /**
  28. * @Description: 番茄-休息状态类
  29. * @Date: 2025-02-08 10:53
  30. * @Author: gaoyufei
  31. **/
  32. public class RestTomatoState implements TomatoState{
  33. @Override
  34. public void deal(Worker worker) {
  35. System.out.println("工作结束了,好好休息吧");
  36. try {
  37. Thread.sleep(5*60*1000);
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. System.out.println("休息了5分钟");
  42. worker.setTomatoState(new WorkTomatoState());
  43. }
  44. }
  45. /**
  46. * @Description: 工作者
  47. * @Date: 2025-02-08 10:51
  48. * @Author: gaoyufei
  49. **/
  50. public class Worker {
  51. private TomatoState tomatoState;
  52. public Worker(TomatoState tomatoState){
  53. this.tomatoState=tomatoState;
  54. }
  55. public void setTomatoState(TomatoState tomatoState){
  56. this.tomatoState=tomatoState;
  57. }
  58. public void startTomatoClock(){
  59. this.tomatoState.deal(this);
  60. }
  61. }
  62. /**
  63. * @Description: 客户端
  64. * @Date: 2025-02-08 11:02
  65. * @Author: gaoyufei
  66. **/
  67. public class Client {
  68. public static void main(String[] args) {
  69. Worker worker=new Worker(new WorkTomatoState());
  70. while (true){
  71. worker.startTomatoClock();
  72. }
  73. }
  74. }
复制代码

3、电梯状态案例

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

  1. /**
  2. * @Description: 电梯状态接口
  3. * @Date: 2025-02-08 9:02
  4. * @Author: gaoyufei
  5. **/
  6. public interface ElevatorState {
  7. void openDoor();
  8. void closeDoor();
  9. void moveUp();
  10. void moveDown();
  11. void stop();
  12. }
  13. /**
  14. * @Description: 关门状态
  15. * @Date: 2025-02-08 9:05
  16. * @Author: gaoyufei
  17. **/
  18. public class CloseState implements ElevatorState {
  19. private Elevator elevator;
  20. public CloseState(Elevator elevator){
  21. this.elevator=elevator;
  22. }
  23. @Override
  24. public void openDoor() {
  25. System.out.println("电梯门开了");
  26. elevator.setCurrentState(elevator.getOpenState());
  27. }
  28. @Override
  29. public void closeDoor() {
  30. System.out.println("电梯门已经关了");
  31. }
  32. @Override
  33. public void moveUp() {
  34. System.out.println("电梯上升");
  35. elevator.setCurrentState(elevator.getMovingUpState());
  36. }
  37. @Override
  38. public void moveDown() {
  39. System.out.println("电梯下降");
  40. elevator.setCurrentState(elevator.getMovingDownState());
  41. }
  42. @Override
  43. public void stop() {
  44. System.out.println("电梯停止");
  45. elevator.setCurrentState(elevator.getStopState());
  46. }
  47. }
  48. /**
  49. * @Description: 开门状态
  50. * @Date: 2025-02-08 9:07
  51. * @Author: gaoyufei
  52. **/
  53. public class OpenState implements ElevatorState{
  54. private Elevator elevator;
  55. public OpenState(Elevator elevator){
  56. this.elevator=elevator;
  57. }
  58. @Override
  59. public void openDoor() {
  60. System.out.println("电梯门已经打开");
  61. }
  62. @Override
  63. public void closeDoor() {
  64. System.out.println("电梯门关了");
  65. elevator.setCurrentState(elevator.getCloseState());
  66. }
  67. @Override
  68. public void moveUp() {
  69. System.out.println("电梯门打开状态,不能上升");
  70. }
  71. @Override
  72. public void moveDown() {
  73. System.out.println("电梯门打开状态,不能下降");
  74. }
  75. @Override
  76. public void stop() {
  77. System.out.println("电梯门打开状态,不能变换为停止状态");
  78. }
  79. }
  80. /**
  81. * @Description: 停止状态
  82. * @Date: 2025-02-08 9:59
  83. * @Author: gaoyufei
  84. **/
  85. public class StopState implements ElevatorState{
  86. private Elevator elevator;
  87. public StopState(Elevator elevator){
  88. this.elevator=elevator;
  89. }
  90. @Override
  91. public void openDoor() {
  92. System.out.println("电梯门开了");
  93. elevator.setCurrentState(elevator.getOpenState());
  94. }
  95. @Override
  96. public void closeDoor() {
  97. System.out.println("电梯门关了");
  98. elevator.setCurrentState(elevator.getCloseState());
  99. }
  100. @Override
  101. public void moveUp() {
  102. System.out.println("电梯上升");
  103. elevator.setCurrentState(elevator.getMovingUpState());
  104. }
  105. @Override
  106. public void moveDown() {
  107. System.out.println("电梯下降");
  108. elevator.setCurrentState(elevator.getMovingDownState());
  109. }
  110. @Override
  111. public void stop() {
  112. System.out.println("电梯停止");
  113. }
  114. }
  115. /**
  116. * @Description: 上升状态
  117. * @Date: 2025-02-08 9:07
  118. * @Author: gaoyufei
  119. **/
  120. public class MovingUpState implements ElevatorState{
  121. private Elevator elevator;
  122. public MovingUpState(Elevator elevator){
  123. this.elevator=elevator;
  124. }
  125. @Override
  126. public void openDoor() {
  127. System.out.println("电梯正在上升,不能开门");
  128. }
  129. @Override
  130. public void closeDoor() {
  131. System.out.println("电梯已经关门");
  132. }
  133. @Override
  134. public void moveUp() {
  135. System.out.println("电梯正在上升");
  136. }
  137. @Override
  138. public void moveDown() {
  139. System.out.println("电梯下降");
  140. elevator.setCurrentState(elevator.getMovingDownState());
  141. }
  142. @Override
  143. public void stop() {
  144. System.out.println("电梯停止");
  145. elevator.setCurrentState(elevator.getStopState());
  146. }
  147. }
  148. /**
  149. * @Description: 下降状态
  150. * @Date: 2025-02-08 9:08
  151. * @Author: gaoyufei
  152. **/
  153. public class MovingDownState implements ElevatorState{
  154. private Elevator elevator;
  155. public MovingDownState(Elevator elevator){
  156. this.elevator=elevator;
  157. }
  158. @Override
  159. public void openDoor() {
  160. System.out.println("电梯正在下降,不能开门");
  161. }
  162. @Override
  163. public void closeDoor() {
  164. System.out.println("电梯正在下降,已经关门了");
  165. }
  166. @Override
  167. public void moveUp() {
  168. System.out.println("电梯上升");
  169. elevator.setCurrentState(elevator.getMovingUpState());
  170. }
  171. @Override
  172. public void moveDown() {
  173. System.out.println("电梯正在下降");
  174. }
  175. @Override
  176. public void stop() {
  177. System.out.println("电梯停止");
  178. elevator.setCurrentState(elevator.getStopState());
  179. }
  180. }
  181. /**
  182. * @Description: 电梯
  183. * @Date: 2025-02-08 9:04
  184. * @Author: gaoyufei
  185. **/
  186. public class Elevator {
  187. private ElevatorState closeState;
  188. private ElevatorState openState;
  189. private ElevatorState movingDownState;
  190. private ElevatorState movingUpState;
  191. private ElevatorState stopState;
  192. private ElevatorState currentState;
  193. public Elevator(){
  194. closeState=new CloseState(this);
  195. openState=new OpenState(this);
  196. movingDownState=new MovingDownState(this);
  197. movingUpState=new MovingUpState(this);
  198. stopState=new StopState(this);
  199. currentState=closeState;// 默认初始状态为关闭状态
  200. }
  201. public void setCurrentState(ElevatorState currentState) {
  202. this.currentState = currentState;
  203. }
  204. public ElevatorState getCloseState() {
  205. return closeState;
  206. }
  207. public ElevatorState getOpenState() {
  208. return openState;
  209. }
  210. public ElevatorState getMovingDownState() {
  211. return movingDownState;
  212. }
  213. public ElevatorState getMovingUpState() {
  214. return movingUpState;
  215. }
  216. public ElevatorState getStopState() {
  217. return stopState;
  218. }
  219. public void openDoor(){
  220. currentState.openDoor();
  221. }
  222. public void closeDoor(){
  223. currentState.closeDoor();
  224. }
  225. public void moveUp(){
  226. currentState.moveUp();
  227. }
  228. public void moveDown(){
  229. currentState.moveDown();
  230. }
  231. public void stop(){
  232. currentState.stop();
  233. }
  234. }
  235. /**
  236. * @Description: 客户端
  237. * @Date: 2025-02-08 9:29
  238. * @Author: gaoyufei
  239. **/
  240. public class Client {
  241. public static void main(String[] args) {
  242. //初始关闭状态
  243. Elevator elevator=new Elevator();
  244. //关门
  245. elevator.closeDoor();//输出 电梯门已经关了
  246. //开门
  247. elevator.openDoor();//输出 电梯门开了
  248. //上升
  249. elevator.moveUp();//输出 电梯门打开状态不能上升
  250. //关门
  251. elevator.closeDoor();//输出 电梯门关了
  252. //上升
  253. elevator.moveUp();//输出 电梯上升
  254. //关门
  255. elevator.closeDoor();//输出 电梯已经关门
  256. //下降
  257. elevator.moveDown();//输出 电梯下降
  258. //停止
  259. elevator.stop();//输出 电梯停止
  260. //开门
  261. elevator.openDoor();//输出 电梯门开了
  262. //停止
  263. elevator.stop();//输出 电梯门打开状态,不能变换为停止状态
  264. }
  265. }
复制代码

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2024-6-17
最后登录
2024-6-17

发表于 2025-7-13 14:18:37 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表