状态设计模式

news2024/11/16 7:27:05

一、状态模式

1、定义

状态模式(State Pattern)又称作状态机模式(State Machine Pattern),允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。属于行为型设计模式。

状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。

状态模式主要解决的就是控制一个对象状态的条件表达式过于复杂时的情况。通过把状态的判断逻辑转移到表示不同状态的一系列类中,可以吧复杂的判断逻辑简化。

2、结构

(1)模式的结构

主要角色如下:

  • 环境类角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责具体状态的切换。
  • 抽象状态角色(IState):定义该状态下的行为,可以有一个或多个行为。
  • 具体状态角色(ConcreteState):具体实现该状态对应的行为,并且在需要的情况下进行状态切换。

3、优缺点

优点:

  • 结构清晰:将状态定义成类,消除了复杂条件表达式逻辑,使代码更加简洁,提高了系统的可维护性。
  • 状态类职责明确且具备扩展性。

缺点:

  • 类膨胀:如果一个事务具备很多状态,则会造成状态类太多。
  • 状态模式对开闭原则的支持并不太好。

4、使用场景

  • 行为随状态而改变的场景。
  • 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。

二、模式的通用实现

代码如下:

public class StatePattern {

	public static void main(String[] args) {
		Context context = new Context();
		context.setState(new ConcreteStateA());
		context.handle();

		System.out.println("-------------------");
		context.setState(new ConcreteStateB());
		context.handle();
	}
}

// 环境类角色
class Context{
	public static final State STATE_A = new ConcreteStateA();
	public static final State STATE_B = new ConcreteStateB();
	// 默认 STATE_A
	private State currentState = STATE_A;

	{
		STATE_A.setContext(this);
		STATE_B.setContext(this);
	}

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

	public State getState() {
		return currentState;
	}

	public void handle(){
		this.currentState.handle();
	}
}

// 抽象状态角色
abstract class State{
	protected Context context;

	public void setContext(Context context) {
		this.context = context;
	}

	public abstract void handle();
}

// 具体状态角色
class ConcreteStateA extends State{
	@Override
	public void handle() {
		System.out.println("ConcreteStateA do something");
		// ConcreteStateA执行完之后自动切换到 ConcreteStateB
		this.context.setState(Context.STATE_B);
		this.context.getState().handle();

	}
}

class ConcreteStateB extends State{
	@Override
	public void handle() {
		System.out.println("ConcreteStateB do something");
	}
}

在这里插入图片描述

– 求知若饥,虚心若愚。

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

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

相关文章

Python:面向对象

目录 一、类的定义 基本语法 python与Java关于类的封装的区别 自定义构造方法 Java与Python的区别 源码 同一个类多种构造函数的构建 源码 二、魔法方法 基础部分 比较部分 与Java的区别 容器类型 三、属性管理 四、封装 基础部分 方法拓展 五、继承&多态 继…

基础IO——系统调用文件

文章目录1. 知识补充和回顾1.1 回顾C文件接口1.2 理论理解2. 系统调用文件接口2.1 open2.2 怎么使用2.3 close和write2.4 read1. 知识补充和回顾 1. 文件文件内容文件属性。即使创建一个空文件,也会占据磁盘数据。 2. 文件操作文件内容操作文件属性操作。在操作文件…

域名+七牛云+PicGo+pypora

域名七牛云PicGopypora 前提准备: 域名(自己的域名)七牛云 免费注册申请10G空间够用picGo 地址pypora (自行下载) GO!!! 七牛云 注册--->登录--->控制台找到对象存储新建…

如何在AndroidStudio中使用GitHub

文章目录1.确认是否安装git2.添加GitHub账户3.创建库4.创建分支5. push内容在项目中肯定要集成版本管理工具,不过有时候更换电脑或者升级AndroidStudio时原来集成的内容就不在了,还在再次集成git。时间长了就容易忘记如何集成Git,因此整理总结…

工作10年我面试过上百个程序员,真想对他们说…

V-xin:ruyuanhadeng获得600页原创精品文章汇总PDF 一、写在前面 最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不少困惑。 这些同学说自己也做了精心准备,网上搜集了不少Java面试题,然而实际…

详解c++---内存管理

这里写目录标题c语言在堆上申请空间malloccallocreallocfreec中向堆中申请空间的形式new的介绍delete的介绍new与自定义类型new与malloc的不同定位newoperator new与operator delete函数c语言在堆上申请空间 在之前的学习中我们知道c语言主要是通过malloc free calloc&#xf…

Java基础-常用API的使用方法(Math,System,Runtime,Object,BigInteger,BigDecimal)(1)

1 Math类 1.1 概述 tips:了解内容 查看API文档,我们可以看到API文档中关于Math类的定义如下: Math类所在包为java.lang包,因此在使用的时候不需要进行导包。并且Math类被final修饰了,因此该类是不能被继承的。 Math类…

J - 食物链 POJ - 1182

思路: 首先我们要理清楚三种动物之间的关系,那么可以用A到B的距离为1代表为A吃B, 那么就有下图的关系 那么我们用d1表示吃,d2表示被吃,d3表示是同类 对于另一张图也是符合的 然后我们去找每个点和他的根节点的关系 …

resnet(4)------全连接层与softmax

文章目录1. 全连接层2. SoftMax算法1. 全连接层 全连接层,指的是每一个结点都与上一层的所有结点相连,用来把前面几层提取到的特征综合起来。 举个例子,前面通过卷积和池化层提取出来的特征有眼睛鼻子和嘴巴,那我们能单独通过这…

基于tensorflow的深层神经网络(一)为什么神经网络需要解决非线性和异或问题

参考为什么神经网络需要解决多层和非线性问题 - 云社区 - 腾讯云 维基百科对深度学习的精确定义为“一类通过多层非线性变换对高复杂性数据建模算法的合集”。因为深度神经网络是实现“多层非线性变换”最常用的一种方法,所以在实际中基本上可以认为深度学习就是深度…

音频信号特征

1.声音 音信号是由空气压力的变化而产生的,可以测量压力变化的强度,并绘制这些测量值随时间的变化。 声音信号经常在规律的、固定的区间内重复,每个波都具有相同形状,高度表示声音的强度,称之为振幅。 信号完成一个…

论文笔记-时序预测-FEDformer

论文标题:FEDformer: Frequency Enhanced Decomposed Transformer for Long-term Series Forecasting 论文链接: https://arxiv.org/abs/2201.12740 代码链接: https://github.com/DAMO-DI-ML/ICML2022-FEDformer 摘要 尽管基于变压器的方法…

笔记--Ubuntu20.04安装Nvidia驱动、CUDA Toolkit和CUDA CuDNN

目录 1--安装Nvidia驱动 2--安装CUDA 2-1--禁用nouveau 2-2--选择CUDA Toolkit 2-3--下载和安装CUDA Toolkit 2-4--配置环境变量 2-5--测试是否安装成功: 3--安装CUDA CuDNN 4--测试pytorch能否使用Cuda 1--安装Nvidia驱动 ① 查看可安装的Nvidia驱动版本…

Matplotlib学习笔记(第二章 2.13 Matplotlib中的图形(一))

在这里,您将发现大量示例图,其中包含生成它们的代码。 线图(Line Plot) 下面是如何使用plot()创建带有文本标签的线图。 Fig. 1: Simple Plot 多个绘图区域(Multiple subplots in one figure) 多个绘图区域由subplot()函数创建: Fig. 2:…

【小程序】内容滚动方案,视频或者照片上方不随滚动而滚动

💭💭 ✨:内容滚动方案,视频或者照片上方不随滚动而滚动   💟:东非不开森的主页   💜: 优于别人,并不高贵,真正的高贵应该是优于过去的自己。——海明威💜&a…

【图像去噪】基于自适应滤波器消除椒盐噪声图像附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

web前端课程设计(HTML和CSS实现餐饮美食文化网站)静态HTML网页制作

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

论文笔记-时序预测-Informer

论文标题: Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting 论文链接: https://arxiv.org/abs/2012.07436 源码链接: https://github.com/zhouhaoyi/ETDataset 摘要 许多实际应用都需要对长序列时间序列…

游戏开发55课 性能优化12

4.9 带宽优化 带宽优化的目的是减少CPU与GPU之间的数据传输。 4.9.1 LOD(Level Of Detail) LOD即细节层次,根据物体在画面的大小选用不同级别的资源,以减少渲染和带宽的消耗。LOD在图形渲染中应用广泛,适用的对象有…

au cs6七线阁教程 笔记

01 驱动 asio 02 I 监听 R录音 一般是单声道 03 调整音量声相 04 导出 删除轨道文件 07 删除选区 自定义波形剪辑颜色 录音激活后,监听才能激活 08 自动控制 默认控制音量: 09 效果器: Vst3 dll 插件 独立效果器面板,实时&a…