Java中的状态设计模式–示例教程

状态模式行为设计模式之一 。 当对象根据其内部状态更改其行为时,将使用状态设计模式。

如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作。 状态模式用于通过上下文状态实现提供一种系统的,耦合耦合的方式来实现此目的。

上下文是具有对状态的具体实现之一的状态引用的状态,并将请求转发给状态对象以进行处理的类。 让我们用一个简单的例子来理解这一点。

假设我们想用一个简单的按钮实现电视遥控器来执行操作,如果状态为ON,则将打开电视,如果状态为OFF,则将关闭电视。

我们可以使用if-else条件来实现它,如下所示;

package com.journaldev.design.state;public class TVRemoteBasic {private String state="";public void setState(String state){this.state=state;}public void doAction(){if(state.equalsIgnoreCase("ON")){System.out.println("TV is turned ON");}else if(state.equalsIgnoreCase("OFF")){System.out.println("TV is turned OFF");}}public static void main(String args[]){TVRemoteBasic remote = new TVRemoteBasic();remote.setState("ON");remote.doAction();remote.setState("OFF");remote.doAction();}}

请注意,客户端代码应该知道用于设置远程状态的特定值,如果状态数量增加,则实现和客户端代码之间的紧密耦合将很难维护和扩展。

现在我们将使用状态模式来实现上面的电视遥控器示例。

状态界面

首先,我们将创建状态接口,该接口定义应由不同的具体状态和上下文类实现的方法。

package com.journaldev.design.state;public interface State {public void doAction();
}

具体状态实现

在我们的示例中,我们可以有两种状态-一种用于打开电视,另一种用于关闭电视。 因此,我们将针对这些行为创建两个具体的状态实现。

package com.journaldev.design.state;public class TVStartState implements State {@Overridepublic void doAction() {System.out.println("TV is turned ON");}}
package com.journaldev.design.state;public class TVStopState implements State {@Overridepublic void doAction() {System.out.println("TV is turned OFF");}}

现在,我们准备实现Context对象,该对象将根据其内部状态更改其行为。

上下文实现

package com.journaldev.design.state;public class TVContext implements State {private State tvState;public void setState(State state) {this.tvState=state;}public State getState() {return this.tvState;}@Overridepublic void doAction() {this.tvState.doAction();}}

请注意,Context还实现State并保留其当前状态的引用,并将请求转发给State实现。

测试程序

现在,让我们编写一个简单的程序,以使用State模式测试我们对TV Remote的实现。

package com.journaldev.design.state;public class TVRemote {public static void main(String[] args) {TVContext context = new TVContext();State tvStartState = new TVStartState();State tvStopState = new TVStopState();context.setState(tvStartState);context.doAction();context.setState(tvStopState);context.doAction();}}

以上程序的输出与TV Remote的基本实现相同,没有使用任何模式。

使用状态模式实现多态行为的好处是显而易见的,出错的机会更少,并且为其他行为添加更多状态非常容易,从而使其更加健壮,易于维护和灵活。 在这种情况下,状态模式还有助于避免if-else或switch-case条件逻辑。

状态模式与策略模式非常相似,请查看Java中的策略模式

多数民众赞成在Java状态模式,我希望你喜欢它。

参考:《 Java中的状态设计模式- 开发人员食谱》博客中JCG合作伙伴 Pankaj Kumar的示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/state-design-pattern-in-java-example-tutorial.html

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

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

相关文章

JS 循环遍历 总结

一、循环遍历语句 for...in... (ES5) 语法:javascript for(keys in obj){}适用:遍历对象说明:   1.keys表示obj对象的每一个键值对的键(键名),所有循环中,需要使用obj[keys]来取到每一个值。 …

java之平台无关

java虚拟机是执行字节码文件(.class)的虚拟机进程。 java源程序(.java)被编译器编译成------>字节码文件(.class),然后字节码文件,将由java虚拟机,解释成------>机器码&#x…

适用于ActiveMQ 5.9的Apache Camel Broker组件

将Apache Camel嵌入ActiveMQ代理可以为使用Camel的集成功能扩展消息代理提供极大的灵活性。 Apache Camel路由的另一个好处是,如果使用activemq组件 ,则可以避免远程连接到ActiveMQ的序列化和网络开销。 关于Apache ActiveMQ真正伟大的事情之一是&#x…

java rpg对战_RpgGame.java

import java.util.Scanner;public class RpgGame {public static void main(String[] args) {System.out.println("--------------------亲爱的勇士欢迎来到文字世界--------------------");System.out.println("--------------------这是一个充斥着危险的世界&…

hive基本操作与应用

通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计,结果放在表word_count里 查看统计结果 转载于:https://www.cnblogs.com/cairuiqi/p/9048256.html

python - classs内置方法 solt

solt # __solt__ # 是一个类变量,变量值可以是列表、元组或者是可迭代对象,也可以是一个字符串 # (以为这所有实例只有一种数据属性) # # 作用:(为了节省内存空间,减少过多的实例属性所占用的内存空间) # 优点: # 1.使用_solt__以后,实例的__dict__属性被去除,从而达到节省…

如何优雅的链式取值之 MayBe 函子

本文基于 如何优雅地链式取值 可能有人之前看过我写的关于函数式编程的东西,也有人看过这一篇文章。由于我还是学生,开发经验相对较少,所以对于函数式编程如何应用存在一些疑惑。之前也问过面试官,说是实际开发中用的比较少&#…

Jackson中的自定义反序列化器和验证

tl; dr:将输入验证添加到Jackson中的自定义json解串器很重要。 在RHQ中,我们在几个地方使用了Json解析-直接在as7 / Wildfly插件中,或者通过RESTEasy 2.3.5间接在REST-api中使用,已经很繁重了。 现在,我们有一个bean…

java ssh shell命令_java 通过ssh 执行命令

java 里面的开源 ssh libjsch 例子JSch jSch new JSch();//设置JSch 的日志,可以看到具体日志信息JSch.setLogger(new Logger() {Overridepublic boolean isEnabled(int level) {return true;}Overridepublic void log(int level, String message) {System.out.pri…

标准易语言学习

1、窗口程序加入自定义局部变量 按CTRLL弹出局部变量表(或点菜单栏上的插入,选择局部变量)转载于:https://www.cnblogs.com/slyzly/articles/9048724.html

c# TCP高性能通信

开篇都是吹牛逼哈。。。 我原本打算使用dotnetty来解决传输问题,但是试了下没有成功,也没有找到相关问题解决方法,导出源码,好大啊。暂时不想研究,而且是.Net Core的。最后没有办法,就自己封装了。我就不上…

vue项目中keep-alive的使用,从详情页返回列表时保存浏览位置

背景描述: 最近在做移动端前端项目中,需要实现以下场景: 1.在页面查询列表,进入详情页时,返回需要页面返回到上次浏览的位置 2.由于查询列表获取的数据可能会短时间改变,如果前端长时间缓存数据&#xf…

Apache log4j是领先的日志记录框架

根据 从零周转开始的调查中, Apache log4j是领先的Java日志记录框架。 这实际上是一个非常有趣的调查。 它显示SLF4J最常用作伐木外墙,占61%。 但是,它似乎最常与Apache Log4j一起使用,52%的调查参与者都…

Centos6.8通过yum安装mysql5.7

Centos6.8通过yum安装mysql5.7 2017年07月13日 14:19:10 阅读数:1067 1.安装mysql的yum源 a.下载配置mysql的yum源的rpm包 根据上面3张图片中的操作下载下来的rpm文件可以通过如下命令获取: wget https://dev.mysql.com/get/mysql57-community-release-e…

codeforces Labyrinth

codeforces Labyrinth Time Limit: 2 Sec   Memory Limit: 512 MB Description You are playing some computer game. One of its levels puts you in a maze consisting of n lines, each of which contains m cells. Each cell either is free or is occupied by an obstac…

在vscode使用editorconfig的正确姿势

editorconfig是什么鬼? editorconfig是用来帮助开发者定义和维护代码风格(行尾结束符、缩进风格等)的东东。 editorconfig支持哪些规则? 请自行参考 https://editorconfig.org/ 如何在vscode中使用editorconfig? 在…

使用Java的Apache Camel入门

Apache Camel是一个非常有用的库,可以帮助您处理来自许多不同来源的事件或消息。 您可以通过许多不同的协议(例如在VM,HTTP,FTP,JMS甚至DIRECTORY / FILE之间)移动这些消息,但仍使处理代码不受传…

Mvc+Hui+SqlSugar+Autofac+NLog+T4 架构设计(一)

一、前言 作为小菜鸟第一次写博客的我还有点小激动,最近开始打算着手写一个属于自己架构。算下来差不多最近花一周多的下班时间了来写这个框架,本来想整体架构开发完成测试完成后才写博客,怕自己没时间或失去动力,就先把自己架构设…

闲话杂谈—至曾经的自己

【这篇闲话杂谈写的背景时间是:2018年9月30号】 今天估计是自己突然灵光一闪,又或许是想到昨天团建时曾经带自己的师傅(刘工)的一番话。让我觉得大家都在变化,都慢慢的不再是曾经咱们一块儿奋斗、一块儿无话不谈&#…

房价在手,天下我有 --反手就撸一个爬虫(终)

接上篇,科科,好,我们继续 我们在这里先把json数据入库吧~ 首先,database/scheme里定义好数据类型。 const mongoose require(mongoose)const detailHouseSchema new mongoose.Schema({ //定义数据模式link:String…