【设计模式】JAVA Design Patterns——State(状态模式)

🔍目的


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

🔍解释


真实世界例子

当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的环境感到愤怒和危险

通俗描述

状态模式允许对象改变它的行为

维基百科

状态模式是一种允许对象在内部状态改变时改变它的行为的行为型设计模式。这种模式接近于有限状态机的概念。状态模式可以被理解为策略模式,它能够通过调用在模式接口中定义的方法来切换策略。

程序示例

创建模式接口和它具体的实现

public interface State {

  void onEnterState();

  void observe();
}

public class PeacefulState implements State {

  private static final Logger LOGGER = LoggerFactory.getLogger(PeacefulState.class);

  private final Mammoth mammoth;

  public PeacefulState(Mammoth mammoth) {
    this.mammoth = mammoth;
  }

  @Override
  public void observe() {
    LOGGER.info("{} is calm and peaceful.", mammoth);
  }

  @Override
  public void onEnterState() {
    LOGGER.info("{} calms down.", mammoth);
  }
}

public class AngryState implements State {

  private static final Logger LOGGER = LoggerFactory.getLogger(AngryState.class);

  private final Mammoth mammoth;

  public AngryState(Mammoth mammoth) {
    this.mammoth = mammoth;
  }

  @Override
  public void observe() {
    LOGGER.info("{} is furious!", mammoth);
  }

  @Override
  public void onEnterState() {
    LOGGER.info("{} gets angry!", mammoth);
  }
}

创建包含状态的长毛象

public class Mammoth {

  private State state;

  public Mammoth() {
    state = new PeacefulState(this);
  }

  public void timePasses() {
    if (state.getClass().equals(PeacefulState.class)) {
      changeStateTo(new AngryState(this));
    } else {
      changeStateTo(new PeacefulState(this));
    }
  }

  private void changeStateTo(State newState) {
    this.state = newState;
    this.state.onEnterState();
  }

  @Override
  public String toString() {
    return "The mammoth";
  }

  public void observe() {
    this.state.observe();
  }
}

 创建长毛象随着时间的推移后的整个行为示例

    var mammoth = new Mammoth();
    mammoth.observe();
    mammoth.timePasses();
    mammoth.observe();
    mammoth.timePasses();
    mammoth.observe();
    
    // The mammoth gets angry!
    // The mammoth is furious!
    // The mammoth calms down.
    // The mammoth is calm and peaceful.

🔍类图


🔍适用场景

在以下两种情况下,请使用State模式

  • 对象的行为取决于它的状态,并且它必须在运行时根据状态更改其行为。
  • 根据对象状态的不同,操作有大量的条件语句。此状态通常由一个或多个枚举常量表示。通常,几个操作将包含此相同的条件结构。状态模式把条件语句的分支分别放入单独的类中。这样一来,你就可以将对象的状态视为独立的对象,该对象可以独立于其他对象而变化。

🔍Ending


State(状态)模式是一种对象行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。State模式的核心思想是将对象的行为封装在不同的状态对象中,并且使得对象在不同状态下可以切换。


希望本文能够帮助读者更深入地理解状态模式,在实际项目中发挥其优势。谢谢阅读!


希望这份博客草稿能够帮助到你。如果有其他需要修改或添加的地方,请随时告诉我

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

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

相关文章

树莓派 5 AI 套件(Hailo)示例

系列文章目录 前言 欢迎访问 Hailo Raspberry Pi 5 示例库。本项目展示了在 Raspberry Pi 5 上演示 Hailo AI 处理器功能的各种示例。这些示例将帮助您开始在嵌入式设备上使用人工智能。更多信息,请访问 Hailo 官方网站和 Hailo 社区论坛。 一、如何设置 Raspberry…

问题:功夫菜产品的成本由哪几方面构成() #经验分享#其他

问题:功夫菜产品的成本由哪几方面构成() A.材料成本(标准投料2%损耗)包材成本直接人工费固定加工费 B.(材料成本包材成本)*(1加价率) C&#x…

【kubernetes】探索k8s集群的配置资源(secret和configma)

目录 一、Secret 1.1Secret 有四种类型 1.2Pod 有 3 种方式来使用 secret 1.3应用场景:凭据 1.4创建 Secret 1.4.1用kubectl create secret命令创建Secret 1.4.2内容用 base64 编码,创建Secret 1.4.2.1Base64编码 1.4.2.2创建YAML文件 1.4.2.3…

2021年vue面试题整理(万字解析)

一、对MVVM的理解 MVVM分为Model、View、ViewModel。 Model 代表数据模型,数据和业务逻辑都在Model层中定义;泛指后端进行的各种业务逻辑处理和数据操控,对于前端来说就是后端提供的 api 接口。 View 代表UI视图,负责数据的展示…

Windows系统中好用的闪迪U盘修复工具

本文向你介绍了一款简单好用的闪迪U盘修复工具,它可以帮助你轻松修复闪迪U盘的各种问题。该工具操作简单,能帮用户节省大量的时间和精力。 闪迪U盘损坏可以修复吗? “我有一只32GB的闪迪U盘出现了问题,可能是因为我在关机前将它强…

基于51单片机水塔水位控制系统

基于51单片机水塔水位控制 (仿真+程序) 功能介绍 具体功能: 1.用滑动变阻器模拟水位,ADC0809将模拟信号转换为数字信号; 2.LCD1602显示当前水位和水位阈值; 3.当水位超过设定阈值&#xff…

Linux系统之部署Blog-Index导航页

Linux系统之部署Blog-Index导航页 一、Blog-Index介绍1.1 Blog-Index简介1.2 Blog-Index特点1.3 Blog-Index使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍2.3 Yarn介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装yarn 四…

C语言scanf( ) 函数、fprintf( ) 函数与 scanf( ) 函数和printf( ) 函数有什么不同?

一、问题 fscanf( ) 函数、fprintf( ) 函数与 printf( ) 函数、scanf( ) 函数的作⽤相似,都是格式化读写函 数,那么这两个读写函数有什么不同呢? 二、解答 两者的区别就在于前⾯的字符“f”,即 fscanfQ函数和 fprintfD函数的读写…

2005-2022年各省居民人均消费支出数据(无缺失)

2005-2022年各省居民人均消费支出数据(无缺失) 1、时间:2005-2022年 2、来源:国家统计局、统计年鉴 3、指标:全体居民人均消费支出 4、范围:31省 5、缺失情况:无缺失 6、指标解释 居民人…

【经验分享】搭建跨境电商那个独立站必备的功能模块以及实现

搭建跨境电商独立站时,需要确保网站具备一系列关键的功能板块,以提供用户友好的购物体验并确保业务的顺利进行。以下是这些功能板块的详细归纳: 注册登录与身份验证: 用户注册与登录:允许用户创建账户,通过…

排查互联网敏感信息,对信息泄露说“不”

前言 01 近几年,随着我国对网络安全的重视,贴近实战的攻防演练活动越发丰富,各单位的网络安全建设也逐步从“事后补救”升级为“事前防控”。在演练中,进攻方会在指定时间内对防守方发动网络攻击,检测出防守方存在的…

这才是计科之 Onix XV6 源码分析(3、Unix-like系统的进程调度模块)

这才是计科之 Onix & XV6 源码分析(3、Unix-like系统的进程调度模块) 前言 前面已经分析了XV6的启动流程以及内存管理,接下来,我们探究进程调度的实现。与其说进程调度,我觉得可以顺应内存的虚拟化的叫法&#x…

Python报错:IndentationError: unexpected indent问题的解决办法及原因

解决Python报错:IndentationError: unexpected indent问题的解决办法及原因 Python是一种注重可读性的编程语言,它使用缩进来定义代码块。如果你遇到了IndentationError: unexpected indent的错误,这意味着Python解释器在代码中遇到了意外的缩…

HTML,CSS,JavaScript实例——3D骰子,跨纬度蠕虫,动态登录表单。

文章目录 一、3D筛子1.HTML2.CSS 二、跨纬度蠕虫1.HTML2.CSS3.JS 三、动态登录表单1.HTML2.CSS 一、3D筛子 1.HTML <!--ring div starts here--> <div class"ring"><i style"--clr:#00ff0a;"></i><i style"--clr:#ff0057…

如何拼接全景图?PTGui Pro macOS安装包

PTGui Pro是一款功能强大的全景图像拼接软件&#xff0c;特别适合专业摄影师和设计师使用。它能够将多张照片拼接成高质量的全景图&#xff0c;支持普通、圆柱和球形等多种全景模式。软件提供了自动图像拼接和手动模式&#xff0c;用户可根据需求灵活选择。同时&#xff0c;PTG…

大屏可视化建设方案(word)

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.…

平稳交付 20+ 医院,卓健科技基于 OpenCloudOS 的落地实践

导语&#xff1a;随着数字化转型于各个行业领域当中持续地深入推进&#xff0c;充当底层支撑的操作系统正发挥着愈发关键且重要的作用。卓健科技把 OpenCloudOS 当作首要的交付系统&#xff0c;达成了项目交付速度的提升、安全可靠性的增强、运维成本的降低。本文将会阐述卓健科…

源码解析:从零解读SAM(Segment Anything Model)大模型!

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

Postman 打开错误的解决方法

错误如下&#xff1a; PostMan的文件都是放在用户文件下&#xff0c;所以在Local和Roaming文件夹下查看&#xff0c;并删除所有PostMan相关文件夹。 我电脑上的路径在 C:\Users\Administrator\AppData\Local 和 C:\Users\Administrator\AppData\Roaming【Administrator为系…

南山代理记账,为您提供专业、高效的服务和全方位的支持

随着商业活动的不断深化和扩展&#xff0c;企业的会计工作越来越重要&#xff0c;而作为一家专业的代理记账公司&#xff0c;“南山代理记账”始终致力于为客户提供专业、高效的服务&#xff0c;帮助他们在经营过程中更好地管理和运用资金。 南山代理记账公司的服务范围广泛&am…