22-Java状态模式 ( State Pattern )

Java状态模式

    • 摘要
    • 实现
    • 范例

  • 状态模式(State Pattern)中类的行为是基于它的状态改变的

  • 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象

  • 状态模式属于行为型模式

摘要

1. 意图

  • 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类

2. 主要解决

  • 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为

3. 何时使用

  • 代码中包含大量与对象状态有关的条件语句

4. 如何解决

  • 将各种具体的状态类抽象出来

5. 关键代码

通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法
而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值
也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法
状态模式和命令模式一样,也可以用于消除 if…else 等条件选择语句

6. 应用实例

  • 打篮球的时候运动员可以有正常状态、不正常状态和超常状态;
  • 曾侯乙编钟中,’钟是抽象接口’,’钟A’等是具体状态,’曾侯乙编钟’是具体环境(Context);

7. 优点

  • 封装了转换规则;
  • 枚举可能的状态,在枚举状态之前需要确定状态种类;
  • 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为;
  • 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块;
  • 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数;

8. 缺点

  • 状态模式的使用必然会增加系统类和对象的个数;
  • 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱;
  • 状态模式对”开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码;

9. 使用场景

  • 行为随状态改变而改变的场景;
  • 条件、分支语句的代替者;

10. 注意事项

  • 在行为受状态约束的时候使用状态模式,而且状态不超过 5 个

实现

在这里插入图片描述

  • 我们将创建一个 StateInterface 接口和实现了 StateInterface 接口的实体状态类。
  • Context 是一个带有某个状态的类
  • StatePatternDemo ,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化

范例

1. 创建一个接口 StateInterface

StateInterface.java

package com.demo.gof;
public interface StateInterface {
   public void doAction(Context context);
}

2. 创建实现接口的实体类

StartState.java

package com.demo.gof;
public class StartState implements StateInterface {

   public void doAction(Context context) {
      System.out.println("Player is in start state");
      context.setState(this);   
   }

   public String toString(){
      return "Start State";
   }
}

StopState.java

package com.demo.gof;
public class StopState implements StateInterface {

   public void doAction(Context context) {
      System.out.println("Player is in start state");
      context.setState(this);   
   }

   public String toString(){
      return "Stop State";
   }
}

3. 创建 Context 类

Context.java

package com.demo.gof;
public class Context {
   private State state;

   public Context(){
      state = null;
   }

   public void setState(State state){
      this.state = state;       
   }

   public State getState(){
      return state;
   }
}

4. 使用 Context 来查看当状态 State 改变时的行为变化

StatePatternDemo.java

package com.demo.gof;
public class StatePatternDemo {
   public static void main(String[] args) {
      Context context = new Context();

      StartState startState = new StartState();
      startState.doAction(context);

      System.out.println(context.getState().toString());

      StopState stopState = new StopState();
      stopState.doAction(context);

      System.out.println(context.getState().toString());
   }
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/StatePatternDemo.java
$ java  com.demo.gof.StatePatternDemo
Player is in start state
Start State
Player is in stop state
Stop State

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt之格栅布局(QGridLayout)控件填满整个单元格

Qt专栏:http://t.csdnimg.cn/GQN1M 目录 1.现象1 2.解决方案 3.现象2 4.解决方案 5.总结 1.现象1 今天在用QGridLayout布局的时候,添加到布局的QWidget有文本框、标签、组合框和按钮等等,布局两列,通过下面的方式添加进去的&…

Edge-TTS:微软推出的,免费、开源、支持多种中文语音语色的AI工具

项目地址:rany2/edge-tts: Use Microsoft Edges online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an API key (github.com) Edge-TTS是由微软推出的文本转语音Python库,通过微软Azure Cognitive Services转化文…

计算机网络——OSI网络层次模型

计算机网络——OSI网络层次模型 应用层表示层会话层传输层TCP和UDP协议复用分用 网络层数据链路层物理层OSI网络层次模型中的硬件设备MAC地址和IP地址MAC地址IP地址MAC地址和IP地址区别 OSI网络层次模型通信过程解释端到端点到点端到端和点到点的区别 我们之前简单介绍了一下网…

在【IntelliJ IDEA】中配置【Tomcat】【2023版】【中文】【图文详解】

作为一款功能强大的集成开发环境(IDE),IntelliJ IDEA为Web服务器提供了卓越的支持,从而极大地简化了程序员在Web开发过程中的工作流程。学习Java Web开发实质上就是掌握如何创造动态Web资源,这些资源在完成开发后&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)

显示一段文本的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…

(码农福利) 介绍几个不用魔法 就能免费使用的AI工具

因为 AI的飞速发展 IT行业已经可以说非常的卷了 作为程序员 如果不具备 AI 使用的能力 很快就会被淘汰 但 在社区内 无法直接谈论魔法 大部分程序员 可能也不具备魔法 今天说一个不需要魔法 好用的 AI工具 我们打开官网 https://chandler.bet/#/overView 点击 Get Chrome Ex…

部署docker仓库harbor

1、下载包 1、包已上传有两个harbor.v2.6.0.tar与harbor.tar 2、harbor.tar解压后会生成harbor目录,将harbor.v2.6.0.tar移动到harbor目录下。 3、执行harbor目录下的install.sh 4、执行完后修改配置文件 2、修改配置文件 vim /root/harbor/make/ harbor.yml.tmpl …

微信小程序-day01

文章目录 前言微信小程序介绍 一、为什么要学习微信小程序?二、微信小程序的历史创建开发环境1.注册账号2.获取APPID 三、下载微信开发者工具1.创建微信小程序项目2.填写相关信息3.项目创建成功 四、小程序目录结构项目的主体组成结构 总结 前言 微信小程序介绍 微信小程序&…

【计算机视觉】一、计算机视觉概述

文章目录 一、计算机视觉二、计算机视觉与其它学科领域的关系1、图像处理2、计算机图形学3、模式识别4、人工智能(AI)5、神经生理学与认知科学 三、计算机视觉的应用1. 人脸识别2. 目标检测3. 图像生成4. 城市建模5. 电影特效6. 体感游戏动作捕捉7. 虚拟…

Android Kotlin知识汇总(一)编程语言

在 2019 年 Google I/O 大会上宣布今后将优先采用 Kotlin 进行 Android 开发。Kotlin 是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。如果您想构建 Android 应用,建议您从 Kotlin 开始着手&#x…

电机控制杂谈——载波比降低对电机控制性能的影响以及简单的补救措施

在低速大功率和高速领域,受限于开关损耗、 散热能力以及系统效率,驱动器开关频率与电机基频的比值(即载波比)往往较低。(有的文献里也叫做基频比) 当载波比低于 15 时,认为电机工作在低载波比工…

新火种AI|GPT-4诞生1年,OpenAI把它放到了机器人上

作者:一号 编辑:美美 ChatGPT拥有了身体,机器人也有了灵魂。 从OpenAI在去年3月14日拿出GPT-4后,已经过了整整一年。显然,在GPT-4诞生之后的这一年,一切都迭代得太快了,从GPT-4展现多模态能力&…

Qt教程 — 3.1 深入了解Qt 控件:Buttons按钮

目录 1 Buttons按钮简介 1.1 Buttons按钮简介 1.2 Buttons按钮如何选择 2 如何使用Buttons按钮 2.1 QPushButton使用-如何自定义皮肤 2.2 QToolButton使用-如何设置帮助文档 2.3 QRadioButton使用-如何设置开关效果 2.4 QRadioButton使用-如何设置三态选择框 2.5 QCom…

吴恩达deeplearning.ai:独热编码One-hot连续有价值的特征回归树

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 One-hot编码连续有价值的特征回归树 在之前的决策树例子中,每个分裂都只有两种选择,但是今天我们将提到一种新的分裂方式叫做One-hot,可以解决以…

【Cookie和Session辨析】

1.cookie 1.1什么是cookie Cookie 是一种在客户端(通常是 Web 浏览器)和服务器之间传递信息的机制,用于在客户端存储少量的数据。它由服务器发送到客户端浏览器,然后浏览器会将这些数据存储在本地,并在后续的请求中将…

力扣热题100_矩阵_73_矩阵置零

文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

基于Java+SpringBoot+vue的图书购物商城系统详细设计和实现

基于JavaSpringBootvue的图书购物商城系统详细设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

linux sshd_config配置说明

[root01 ssh]# cat sshd_config #######################SSH Base Config################## #######通过OpenSSH工具入xshell连接默认端口 可以改成其他默认是22 PAM 认证过程 1)使用者执行/usr/bin/passwd程序,并输入密码。 2)passwd开…

热点篇(三)-促进传统地产的数字化、网络化和智能化转型

在全国两会召开之际,两会代表纷纷建言“数字化”,全国人大代表、58同城CEO姚劲波指出,在数字中国的大背景下,房地产行业也需要将新的技术与传统地产相融合,从数字基建、数字管理到智能化开发等各个环节实现数字化的流程…

C语言之文件操作(万字详解)

个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言 文件的打开和关闭 流和标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 fputc的使用 fgetc的使用 fput…