今天工作状态怎么变化的?看看设计模式--状态模式

状态模式

状态模式(State):当一个对象的内在状态变化时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。

当然了,如果这个状态判断很简单,那么就没必要使用状态模式了。

状态模式(State)结构图

在这里插入图片描述

  • State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
public abstract class State {abstract void handle(Context context);
}
  • ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为。
// 具体状态A类
public class ConcreteStateA extends State {@Overridevoid handle(Context context) {// 设置下一个状态是B类对象context.setState(new ConcreteStateB());}
}
// 具体状态B类
public class ConcreteStateB extends State {@Overridevoid handle(Context context) {// 设置下一个状态是A类对象context.setState(new ConcreteStateA());}
}
  • Context,维护一个State对象,这个实例对象定义当前的状态
public class Context {private State state;public Context(State state) {this.state = state;}public State getState() {return state;}public void setState(State state) {this.state = state;System.out.println("当前状态:" + this.state.getClass().getName());}public void request() {this.state.handle(this);}
}
  • 客户端,多次调用切换状态
Context context = new Context(new ConcreteStateA());context.request();	
context.request();
context.request();
context.request();

实例

例:将工作时的工作状态使用编程方式实现一下:

臃肿实现方式:

static int hour = 0;
static boolean workFinished = false;
static void writeProgram() {if (hour < 12) {System.out.println("当前时间:" + hour + "点 上午工作 精神百倍!");} else if (hour < 13) {System.out.println("当前时间:" + hour + "点 饿了,去干饭,犯困,午休");} else if (hour < 17) {System.out.println("当前时间:" + hour + "点 下午状态还行,继续努力");} else {if (workFinished) {System.out.println("当前时间:" + hour + "点 下班走人");} else {if (hour < 21) {System.out.println("当前时间:" + hour + "点 加班哦,很疲惫");} else {System.out.println("当前时间:" + hour + "点 嘎嘎累 要睡着了");}}}
}
  • 客户端
hour = 9;
writeProgram();hour = 11;
writeProgram();hour = 12;
writeProgram();hour = 13;
writeProgram();workFinished = false;
hour = 19;
writeProgram();

那么可以看到,很多状态的切换都是这样子面向过程的方式实现。如何进行封装呢,就使用到了状态模式。

给个结构图

在这里插入图片描述

将所有时间段的工作状态都分别封装到一个类中。请看具体实现。

  • 抽象状态类
public abstract class State {abstract void writeProgram(Work w);
}
  • 工作状态类
// 上午工作状态
public class ForenoonState extends State {@Overridevoid writeProgram(Work w) {if (w.getHour() < 12) {System.out.println("当前时间:" + w.getHour() + "点 上午工作 精神百倍!");} else {w.setCurrent(new NoonState());w.writeProgram();}}
}// 中午工作状态
public class NoonState extends State {@Overridevoid writeProgram(Work w) {if (w.getHour() < 13) {System.out.println("当前时间:" + w.getHour() + "点 饿了,去干饭,犯困,午休");} else {w.setCurrent(new AfternoonState());w.writeProgram();}}
}// 下午工作状态
public class AfternoonState extends State {@Overridevoid writeProgram(Work w) {if (w.getHour() < 17) {System.out.println("当前时间:" + w.getHour() + "点 下午状态还行,继续努力");} else {w.setCurrent(new EveningState());w.writeProgram();}}
}// 晚间工作状态
public class EveningState extends State {@Overridevoid writeProgram(Work w) {if (w.isWorkFinished()) {w.setCurrent(new RestState());  //完成任务下班w.writeProgram();} else {if (w.getHour() < 21) {System.out.println("当前时间:" + w.getHour() + "点 加班哦,很疲惫");} else {w.setCurrent(new SleepingState());  // 转入睡眠工作状态w.writeProgram();}}}
}// 睡眠工作状态
public class SleepingState extends State {@Overridevoid writeProgram(Work w) {System.out.println("当前时间:" + w.getHour() + "点 嘎嘎累 要睡着了");}
}// 下班
public class RestState extends State {@Overridevoid writeProgram(Work w) {System.out.println("当前时间:" + w.getHour() + "点 下班走人");}
}
  • 客户端调用
Work w = new Work();
w.setHour(10);
w.writeProgram();w.setHour(12);
w.writeProgram();w.setHour(15);
w.writeProgram();w.setHour(17);
w.writeProgram();w.setWorkFinished(false);
w.setHour(19);
w.writeProgram();w.setHour(22);
w.writeProgram();

好处和用处

好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开。

将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存放在于某个ConcreteState类中,所以通过定义新的子类可以很容易增加新的状态和转换。

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就需要考虑使用状态模式了了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/310515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP-MySQL图书管理系统(附源代码)

本系统采用phpstudy开发平台&#xff0c;采用PHP和MySQL数据库进行开发&#xff0c;开发工具为HBuilder。phpStudy是一个PHP调试环境的程序集成最新的 ApachePHPMySQLphpMyAdmin,一次性安装&#xff0c;无须配置即可使用&#xff0c;是非常方便、好用的PHP调试环境。&#xff…

计算机网络-动态路由

网络层协议&#xff1a;ip&#xff0c;ospf&#xff0c;rip&#xff0c;icmp共同组成网络层体系 ospf用于自治系统内部。 一个路由器或者网关需要能够支持多个不同的路由协议&#xff0c;以适应不同的网络环境。特别是在连接不同自治系统的边缘路由器或边界网关的情况下&#…

在线H5网页版植物大战僵尸游戏源代码

源码介绍 HTML5植物大战僵尸网页版游戏源码&#xff0c;直接把源码上传到服务器就能使用和访问

Tomcat与Servlet是什么关系

Tomcat与Servlet是什么关系 Apache Tomcat和Servlet之间存在密切的关系&#xff0c;可以说它们是一对密切合作的组件。下面是它们的关系&#xff1a; Tomcat是Servlet容器&#xff1a; Tomcat是一个开源的、轻量级的Servlet容器。Servlet容器是一个Web服务器扩展&#xff0c;用…

JVM的生命周期

1.加载&#xff08;Loading&#xff09;&#xff1a; 在加载阶段&#xff0c;JVM会找到并加载Java字节码文件。加载阶段分为三个步骤&#xff1a;通过类的全限定名找到对应的字节码文件&#xff0c;创建一个与该类相关的Class对象&#xff0c;将类的静态数据结构存储在方法区中…

[Angular] 笔记 20:NgContent

chatgpt: 在Angular中&#xff0c;NgContent是用于内容投影&#xff08;Content Projection&#xff09;的一个重要概念。它允许你在一个组件中插入内容&#xff0c;并将这些内容投影到另一个组件中。 当你在一个组件中使用<ng-content></ng-content>标签时&…

00TD I 无论男孩女孩都要尽情打扮

宝藏时尚单品&#xff0c;怎么穿都好看系列 经典宽松版型&#xff0c;韩系慵懒范儿 时尚吸睛蓝色&#xff0c;青春活力满满 轻松好搭配&#xff0c;秒变时尚小达人

sklearn学习的一个例子用pycharm jupyter

环境 运行在jupyter 进行开发。即一个WEB端的开发工具。能适时显示开发的输出。后缀用的是ipynb.pycharm也可以支持。但也要提示按装jupyter. 或直接用andcoda 这里我们用pycharm进行项目创建 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyterlab pip ins…

如何处理并下载Sentinel-5数据

SENTINEL-5是欧洲空间局&#xff08;European Space Agency&#xff0c;ESA&#xff09;Copernicus计划中的一颗地球观测卫星。SENTINEL-5的主要任务是监测大气成分&#xff0c;特别是臭氧、氮二氧化物、二氧化硫、甲烷和其他气体的分布。这些观测对于了解大气污染、气候变化和…

【用户增长】引言:浅析游戏运营用户增长概念

1 游戏发行运营中的主要职能&#xff1a; ​ 一、发行运营通识l 运营介绍&#xff1a;职能分工、发行运营流程、职业发展能力及要求l 品类认知&#xff1a;行业品类布局、品类用户画像、运营节奏及特性&#xff0c;包含不同品类核心打法及长线运营思路l 海外运营&#xff1a;海…

STM32实战之IAP代码升级

目录 1 IAP介绍 2 内存分区 3 整体设计流程图 4 Boot Loader的代码编写 5 APP1代码编写 6 APP2代码编写 stm32内部flash操作相关函数 1 IAP介绍 IAP&#xff08;In Application Programming&#xff09;即在应用编程&#xff0c; IAP 是用户自己的程序在运行过程中…

不同角度深入探讨Maya和Blender这两款软件的差异

当我们面对三维建模软件的选择时&#xff0c;许多初学者可能会感到迷茫。今天&#xff0c;我们将从不同角度深入探讨Maya和Blender这两款软件的差异&#xff0c;特别是对于游戏建模领域的用户来说&#xff0c;这将有助于您更好地理解两者之间的区别。 软件授权与开发背景&#…