状态模式:将对象行为与状态解耦

devtools/2024/11/14 19:40:59/

状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来好像修改了其类。

状态模式的核心思想是将对象的行为封装在不同的状态对象中,每个状态对象都代表了对象在某一特定状态下的行为。当对象的状态发生变化时,它会切换到相应的状态对象,从而改变其行为。

一,状态模式的结构

状态模式主要包含以下几个部分:

  • Context:维护一个State实例,这个实例定义当前状态。
  • State:定义一个接口,用于封装与Context的一个特定状态相关的行为。
  • ConcreteState:实现State接口的具体状态类。

uml类图:
在这里插入图片描述

二,状态模式的实现

以下是一个简单的状态模式示例,模拟一个简单的电灯开关。

java">// State接口
public interface State {void handleRequest();
}// 具体状态类:开灯状态
public class OnState implements State {@Overridepublic void handleRequest() {System.out.println("Turning light off...");}
}// 具体状态类:关灯状态
public class OffState implements State {@Overridepublic void handleRequest() {System.out.println("Turning light on...");}
}// Context类
public class Light {private State state;public Light() {state = new OffState(); // 初始状态为关灯}public void setState(State state) {this.state = state;}public void pressButton() {state.handleRequest();if (state instanceof OffState) {setState(new OnState());} else {setState(new OffState());}}
}// 测试
public class StatePatternDemo {public static void main(String[] args) {Light light = new Light();light.pressButton(); // 输出:Turning light on...light.pressButton(); // 输出:Turning light off...}
}

三,状态模式的优点

  • 封装状态转换:状态转换逻辑被封装在状态类中,Context类的代码更加简洁。
  • 遵循开闭原则:增加新的状态类时,不需要修改现有的状态类和Context类。

四,状态模式的缺点

  • 类的数量增加:每个具体状态都需要定义一个类,可能会导致类的数量增加。
  • 状态切换逻辑分散:状态切换的逻辑分散在各个状态类中,可能难以理解和维护。

五,状态模式的适用场景

  • 对象的行为依赖于其状态,并且需要在运行时根据状态改变其行为。
  • 代码中包含大量与对象状态有关的条件语句。

如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!


http://www.ppmy.cn/devtools/115584.html

相关文章

【25.5】C++智能交友系统

实现男生女生自动匹配的功能 void autoPair(const vector <Boy>& boys, const vector <Girl>& girls) {for (int i 0; i < boys.size(); i) {for (int j 0; j < girls.size(); j) {if (boys[i].satisfied(girls[j]) && girls[j].satisfie…

Git常用命令详解

Git 是一个功能强大的版本控制系统&#xff0c;以下是一些常用的 Git 命令及其解释和案例&#xff1a; 1、配置 git config --global user.name "Your Name"&#xff1a;配置全局用户名。 git config --global user.email "emailexample.com&#xff1a;配置全…

spring boot 定时器配置

1、首先在主类上加EnableScheduling注解 2、在应用类上加Scheduled注解&#xff0c;同时记得添加spring的组件注解Component&#xff0c;不然无法成功

Qt:静态局部变量实现单例(附带单例使用和内存管理)

前言 本文主要写静态局部变量实现的单例以及单例的释放&#xff0c;网上很多教程只有单例的创建&#xff0c;但是并没有告诉我们单例的内存管理&#xff0c;这就很头疼。静态局部变量实现的单例应该是最简单的单例&#xff0c;而且不需要内存管理。 正文 静态局部变量单例&a…

python --PyAibote自动化

官文: https://www.pyaibote.com/ 下载安卓集成环境: 可以看到开发的一些信息

【Python报错已解决】 Requests.exceptions.ProxyError: HTTPSConnectionPool

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

YOLOv8改进 | 特征融合篇,YOLOv8添加iAFF(多尺度通道注意力模块),并与C2f结构融合,提升小目标检测能力

摘要 特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。虽然它通常通过简单的操作(如求和或拼接)来实现,但这种方式可能并不是最佳选择。在这项工作中,提出了一种统一且通用的方案,即注意力特征融合(Attentional Feature Fusion),适用于…

【Elasticsearch系列十九】评分机制详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…