设计模式(二十一) 状态模式

2023-11-02

状态模式也是一种行为型模式,当我们的程序中需要一些状态转换,对于不同的状态需要不同的行为时,我们就可以考虑使用状态模式。

下面用交通灯来当例子。我们需要红黄绿三种颜色的状态。


interface State {
    void show();
}

class RedState implements State {

    @Override
    public void show() {
        System.out.println("交通灯变红了");

    }
}

class YellowState implements State {

    @Override
    public void show() {
        System.out.println("交通灯变黄了");

    }
}

class GreenState implements State {

    @Override
    public void show() {
        System.out.println("交通灯变绿了");

    }
}

然后需要交通灯,它作为状态类的环境,内部应该有所有状态类的实例,并能按照某种规则转换状态。

public class TrafficLight {
    private State redState = new RedState();
    private State yellowState = new YellowState();
    private State greenState = new GreenState();

    private State current = greenState;

    public void turn() {
        if (current == greenState) {
            current = yellowState;
            current.show();
        } else if (current == yellowState) {
            current = redState;
            current.show();
        } else {
            current = greenState;
            current.show();
        }
    }
}

然后客户类不需要关心内部状态的变化,就可以使用状态类了。

    public void run() {
        TrafficLight light = new TrafficLight();
        light.turn();
        light.turn();
        light.turn();
        light.turn();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式(二十一) 状态模式 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要

随机推荐

  • Arthas使用教程

    什么是 Arthas 摘录一段官方 Github 上的简介 Arthas 是Alibaba开源的Java诊断工具 深受开发者喜爱 当你遇到以下类似问题而束手无策时 Arthas 可以帮助你解决 这个类从哪个 jar 包加载的 为什么会报各种
  • 微信小程序(原生)使用Swiper实现(商品详情)视频和图片轮播(仿京东/淘宝商品详情头部视频+图片轮播)

    一 需求 1 如果第一是视频 不进行自动轮播 2 可以手动滑动切换 3 点击播放视频 也可以手动滑动切换 4 视频播放完后 自动轮播 5 视频可以点击暂停和全屏播放 二 最终效果 三 源码 播放icon使用了TDesign组件库 1 wxm
  • 同一个类的方法怎么Mock?spy函数啦

    大家好 我是神韵 是一个技术 生活博主 出文章目的主要是两个 一是好记忆不如烂笔头 记录总结中提高自己 二是希望我的文章可以帮到大家 欢迎来点赞打卡 你们的行动将是我无限的动力 本篇主题是 同一个类的方法怎么Mock spy函数啦 我在测试
  • C语言fscanf函数的理解

    第一次学文件时 没学太明白 在课程设计时又不得不使用fscanf 因此又复习了一下 fp1 fopen Data FindPassword Qusetion txt r fscanf fp1 s answer i 这意思就是将FindPas
  • idea报错:Parent ‘Unknown:Unknown:Unknown‘ has problems

    导入项目时报错 Parent Unknown Unknown Unknown has problems 问题阐述 查看maven的setting xml文件 值得注意的一点 问题阐述 项目在导入之后 就报错了如下所示错误 Parent Un
  • 【CSS flex布局】用flex写个骰子

    注 新手练习 基本思路 HtML部分 一个大 ul 包裹6个 li 也就是6个骰子 每个 li 中的 span 对应一个骰子点数 ul li span span li li span span span span li li span sp
  • G. 积木画(dp + 滚动数组)

    大致题意 给定2 N的画布 以及两种积木 问填满画布的方法有多少种 思路 数据范围很大 时间复杂度要求O n 可以想到用线性dp来解决 考虑状态转移方程 状态表示 d i j 表示前 i 列都填满 填满第 i 1 列时状态为j的种类数 按j
  • 从hdfs读取image文件

    发现从hdfs直接读取image文件response Image open filepath 会报错路径不存在 出现这个问题是因为PIL的Image open filepath 只能打开本地路径里的文件 不能打开hdfs里的 而且hdfs是
  • (转)牛牛牌型判定(五小牛 > 五花牛 > 炸弹 > 银牛 > 牛牛 > 有牛>没牛)

    牌型大小 五小牛 gt 五花牛 gt 炸弹 gt 银牛 gt 牛牛 gt 有牛 牛987654321 gt 没牛 K gt Q gt J 2 gt A 黑桃 gt 红桃 gt 梅花 gt 方块 同样的牌型比大小 同样的手牌比花色 1 2 在
  • nzAutocomplete监听选择事件,做相应处理

    nzAutocomplete 当组件选择一个选项后 没有回调函数 但想在选择时获取相关的数据 可以通过点击事项 传入相关对象
  • excel 下载方法封装

    1 首先需要拿到后端返回的URL下载地址 2 写个下载方法 url 接口返回的下载地址 例如 https cancer research oss cn beijing aliyuncs com yuance platform permiss
  • Unity 3D 做FPS游戏

    Part 1 Introduction 第一部分 介绍 This tutorial will detail how to make a simple First Person Shooter FPS It will introduce fu
  • 项目类中@Data注解无法使用

    原因 Data注解无法使用 需要安装插件 解决 在idea中找到 File Setting 找到Plugins如下图 输入lombok 点击安装即可 lombok插件 已解决
  • bottomnavigationview 去动画_Android Notes|BottomNavigationView 爱上 Lottie

    鸡老大说 大丈夫岂能久居人下 首发掘金 掘金 个人页 juejin im 前言 好容易解决个问题 感觉记录一波 当日事当日毕 践行鸡老大 点滴积累 万一某天优秀了呢 以前大部分项目底部导航栏关于图片部分的实现 要么两套图 selector
  • python-爬虫(获取NBA球员信息)

    目录 引入外部库 安装XPath 1 下载XPath helper的源码 2 在edge中添加 3 使用Xpath helper 原码 在上一节我们已经配置好了python爬虫的环境python 配置爬虫环境 现在我们就来实践一下吧 引入外
  • Hive集成HBase详解

    摘要 Hive提供了与HBase的集成 使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询 应用场景 1 将ETL操作的数据存入HBase 2 HBase作为Hive的数据源 3 构建低延时的数据
  • 部署elk集群6

    文章目录 一 集群环境 二 部署es 1 192 168 4 115 2 192 168 4 116 3 192 168 4 118 4 启动测试 5 加入开启自启动 6 故障 三 部署logstash 1 官方地址 2 解压安装 3 创建
  • Pycharm2022安装及python环境的搭建

    一 安装Pycharm 首先进入pycharm的官网https www jetbrains com pycharm download section windows 选择社区版进行下载 运行启动安装向导的pycharm 2022 2 4 e
  • cookie注入

    什么是cookie Cookies 确定身份 在服务器产生 存储在客户端的一小段文本信息 格式为字典 键值对 cookie分类 会话级 保存在内存 浏览器关闭则丢失 持久级 保存至硬盘 只有 当失效时间到了才会清除 一般都是持久化比较多 打
  • 设计模式(二十一) 状态模式

    状态模式也是一种行为型模式 当我们的程序中需要一些状态转换 对于不同的状态需要不同的行为时 我们就可以考虑使用状态模式 下面用交通灯来当例子 我们需要红黄绿三种颜色的状态 interface State void show class Re