3.8设计模式——State 状态模式(行为型)

意图

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

结构

  • Context(上下文)定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前状态。
  • State(状态)定义一个接口以封装与Context的一个特定状态相关的行为。
  • ConcreteState(具体状态子类)每个子类实现与Context的一个状态相关的行为。
  • Handle是一个代表处理当前状态的动作或方法的命名。在状态模式中,每个具体状态子类都会实现自己的 handle 方法,用来定义该状态下的具体行为或逻辑。当上下文调用 handle 方法时,实际执行的是当前状态对应的具体状态子类中的 handle 方法。

适用性

  • 一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这个对象可以不依赖于其他对象独立变化。

代码示例

// 状态接口
interface State {void handle();
}// 具体状态子类A
class ConcreteStateA implements State {@Overridepublic void handle() {System.out.println("Handling state A");}
}// 具体状态子类B
class ConcreteStateB implements State {@Overridepublic void handle() {System.out.println("Handling state B");}
}// 上下文类
class Context {private State currentState;public Context() {// 初始状态为AcurrentState = new ConcreteStateA();}public void setState(State state) {this.currentState = state;}public void request() {currentState.handle();}
}// 测试
public class StatePatternExample {public static void main(String[] args) {Context context = new Context();// 初始状态为Acontext.request();// 改变状态为Bcontext.setState(new ConcreteStateB());context.request();}
}

在这个示例中,State接口定义了状态的行为,ConcreteStateA和ConcreteStateB是具体状态子类,分别实现了不同状态下的行为。Context类维护了一个当前状态的实例,根据当前状态来调用相应的行为。在测试中,创建了一个Context对象并初始化为状态A,然后改变状态为B并调用请求方法,观察输出结果。

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

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

相关文章

4 -25

1 100个英语单词两篇六级阅读 2 cf补题; 3 仿b站项目看源码 debug分析业务。 上了一天课,晚上去健身。 物理备课,周六去上课腻。 五一回来毛泽东思想期末考试,概率论期中考试。

冯诺依曼体系结构再谈操作系统

前言 前面对基本的指令、权限以及环境开发的基本工具进行了介绍,本期开始我们将进入系统的的学习,例如我们常听的进程等,在进入进程的学习前我们先要铺垫一下,所以本期我们先来介绍一下冯诺依曼体系结构和再谈操作系统&#xff0…

30 番外5 AHK语法应用实战

番外5 AHK语法应用实战 ahk是一种极其轻量,极其易上手,极其方便好用的脚本语言,对于没有编程基础的人来说,可以轻松掌握. 作为一个强大轻量的工具,ahk主要提供了热键宏操作. 什么是热键宏?简单的理解,就是自定义快捷键. AHK使用场景举例 ahk到底有什么用处呢? 1.把一个按键映…

关于TrAXFilter类在动态加载的利用思考以及如何无视构造器获取对象

第一个问题 今天在又看cc3的时候想不通一个问题,就是关于TrAXFilter这个类,我们看到这个类的构造方法 public TrAXFilter(Templates templates) throwsTransformerConfigurationException{_templates templates;_transformer (TransformerImpl) tem…

DRF案例之车厂API

DRF案例之车厂API 目录 DRF案例之车厂API需求urls.pymodels.pyviews.pyMySerializers.pyMyValidate.pyMyFilter.pyMyPagination.pysettings注册自定义类国际化输出 需求 定义车型表(CarModel),车厂表(CarFactory),经销商表(Distributor)一个车厂可以生产…

做亚马逊店铺怎么解决网络问题?

在全球电商市场迅速崛起的背景下,亚马逊已成为众多商家拓展海外市场的首选平台。然而,网络问题始终困扰着亚马逊商家,若不能有效解决,不仅影响工作效率,更可能面临店铺被封禁的风险。本文将详细介绍亚马逊店铺运营遇到…

C++_跨平台编译_cmakefile中_添加内容

C_跨平台编译_cmakefile.txt中_添加内容, 包含 cmakefile.txt中 1. 系统架构(aarch64) 2. gcc g编译器位置 3. 架构指定: march 4. 你的root一些基础的lib, bin文件路径 (YOUR_SYSROOT) # 在x86上, 编译linux系统下 aarch64版本的库文件: SET(CMAKE_SYSTEM_NAME Linux) SE…

xgp加速器免费 微软商店xgp用什么加速器

2001年11月14日深夜,比尔盖茨亲自来到时代广场,在午夜时分将第一台Xbox交给了来自新泽西的20岁年轻人爱德华格拉克曼,后者在回忆中说:“比尔盖茨就是上帝。”性能超越顶级PC的Xbox让他们趋之若鹜。2000年3月10日,微软宣…

Vision Pro“裸眼上车”,商汤绝影全新舱内3D交互亮相

2023年,Apple Vision Pro的横空出世让人们领略到了3D交互的魅力,商汤绝影通过深厚的技术研发实力和高效的创新迭代效率,带来两大全新座舱3D交互:3D Gaze高精视线交互和3D动态手势交互。 作为全球首创的能够通过视线定位与屏幕图标…

​.NET基础入门​

.Net平台 概念:.net与C# .net/dotnet:一般指.Net Framework框架,一种平台,一种技术。 C#(sharp):一种编程语言,可以开发基于.net平台的应用。 (*)Java即是一种平台又是一种编程语言 .Net FrameWork框架是.Net平台不可缺少的一…

C语言中整型与浮点型在内存中的存储

今天让我们来看看整型的数据和浮点型的数据在内存中是怎么存储的呢 整型数据在内存中的存储 整型数据在内存中存储的是二进制的补码 正数的话也没什么可说的,原码反码补码都相同 我们来看看负数: 以-5为例 原码:10000000 00000000 00000000 0…

题解:CF1946D(Birthday Gift)

题解:CF1946D(Birthday Gift) 题目翻译:给定一个长度为 n n n 的数组 a a a 以及一个数 x x x,请找出最大的 k k k,使得数组 a a a 可以被分成 k k k 个部分,并且将每个部分中所有元素异…

传染病模型SIR及其变体(python版本)

文章目录 传染病模型及其变体1. SI模型1.1代码2. SIS模型2.1 代码3. 基本再生数 basic reproductive number4. SIR模型4.1 代码5. SEIR模型5.1 代码6. SEIJR模型6.1 代码7. SEIJRD模型7.1 代码传染病模型及其变体 1. SI模型 在该模型里面,群体中只有两种人:易感者和感染者。…

磨损对输送带生产效率的影响

磨损对输送带生产效率的影响 在工业生产过程中,输送带作为关键的物流传输设备,广泛应用于各个行业。然而,在实际使用中,输送带往往会因为各种原因出现磨损,这不仅影响了输送带的使用寿命,更对生产效率产生…

shell 实现对Hive表字段脱敏写入新表

数据安全管理,本shell 实现对hive源表敏感字段进行md5加密,然后写入新表; read -p 交互输入:要脱敏的hive表、分区,示例: test_db.table_name 20240331 生成更新hive分区表的hql: insert overwrite table xxx 备注:仅供…

Postman之页面简介 V9.31.0

Postman之页面简介 V9.31.0 一、顶部栏二、左部栏三、中部栏四、下部栏 一、顶部栏 (1)new选项框,生成新建请求、集合、环境等 (2)import选项框,可以导入文件、文件夹、链接、文本信息等 (3&…

ros2_control【B站WMGIII教学学习记录】1

资源 https://www.bilibili.com/video/BV1ku411G7UR? 学习过程中存在bug,记录一下 1 Q:"package ‘joint_state_publisher_gui’ not found, searching: [/home A: sudo apt install ros-humble-joint-state-publisher2 https://fishros.org.cn/forum/to…

go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控

有关包的安装 我们要实现go语言对第三方包的操作需要我们下载第三方包go.etcd.io,下载命令: go get go.etcd.io/etcd/client/v3 ectd的put与get操作 相关函数说明与示例 我们想实现对etcd进行简单的操作的步骤还是比较简单的,在我上一篇文…

代码随想录第二天

有序数组 977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] sortedSquares(int[] nums) {for (int i 0; i < nums.length; i) {nums[i] * nums[i];}Arrays.sort(nums);return nums;} } 长度最小的子数组 class Solution {pub…

爬虫抓取网站数据

Fiddler 配置fiddler工具结合浏览器插件 配置fiddler Tools--Options 抓包技巧 谷歌浏览器开启无痕浏览,使用SwitchyOmega配置好代理端口 Ctrl x 清理所有请求记录,可以删除指定不需要日志方便观察 设置按请求顺序 观察cookie,观察请求hesder cookie和row返回结果 Swit…