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

如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用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

Java中的状态设计模式–示例教程相关推荐

  1. java 设计模式 示例_Java中的状态设计模式–示例教程

    java 设计模式 示例 状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件 ...

  2. Java中的Memento设计模式-示例教程

    记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...

  3. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  4. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  5. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

  6. Java中的观察者设计模式-示例教程

    观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为S ...

  7. java 状态设计模式_实例讲解:Java中的状态设计模式

    Java中的状态设计模式是一种软件设计模式,当对象的内部状态更改时,该模式允许对象更改其行为.状态设计模式通常用于以下情况:对象取决于其状态,并且在运行期间必须根据其内部状态更改其行为.状态设计模式是 ...

  8. Java依赖注入 - DI设计模式示例教程

    Java依赖注入 - DI设计模式示例教程 Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护.我们可以在java中实现依赖注入,以将依赖项解析从编译时移 ...

  9. java 设计模式 示例_Java中的策略设计模式-示例教程

    java 设计模式 示例 策略模式是行为设计模式之一 . 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客 ...

最新文章

  1. 如果宁静是 Oracle,万茜、张雨绮、黄圣依是什么?
  2. 《jQuery UI 开发指南》——1.3 什么是CSS主题
  3. bat脚本监控tomcat并启动_Windows server利用批处理脚本判断端口启动tomcat的方法
  4. 程序员必知必会之blog篇
  5. VTK:vtkAssembly用法实战
  6. Bug接口地址找不到
  7. Vue—相关工具—vue-cli
  8. idea如何连接本地mysql_IDEA如何连接MYSQL
  9. 统计建模与r软件_【统计建模与R软件笔记】008 描述统计量(1)
  10. C语言题目地图上有m个城市,序号依次为1,2,3....m,刚开始你在1,若每次只能从当前城市去往当前序号加1或者加3的城市,要到达m城市(m3),有多少种走法
  11. Android-TextView跑马灯效果
  12. 分享一些android的资料 很实用
  13. 活动目录集成区域DNS服务
  14. character-RNN模型介绍以及代码解析
  15. springboot分页展示功能_SpringBoot实战项目(三)用户列表以及分页功能实现
  16. 考华为云认证的注意事项、认证费用
  17. linux 卸载theano,centos 安装theano
  18. 通过监听手势滑动解决DrawerLayout只能边缘打开抽屉问题
  19. 媒体专访 | 许彬教授:我们离元宇宙Big Bang有多近?
  20. vnc repeater linux,远程桌面中转,基于 UltraVNC Repeater(中继器)的远程桌面服务搭建,用于复杂网络环境...

热门文章

  1. weex安装环境_WEEX跨平台开发环境搭建
  2. kafka消费者开发方式小结
  3. java.rmi.UnmarshalException:errorunmarshalling return; java.lang.ClassNotFoundException的解决方法
  4. 本地方法(JNI)——编码签名
  5. java集合——树集(TreeSet)+对象的比较
  6. java流写入数据库_成为Java流大师–第4部分:数据库流
  7. web api开启错误提示_当HTTP状态代码不足时:处理Web API错误报告
  8. objects jdk8_JDK 9:NotNullOrElse方法已添加到Objects类
  9. java登录界面命令_Java命令行界面(第26部分):CmdOption
  10. java int不将0忽略_Java微服务:蛋糕是骗人的,但您不能忽略它