软件设计模式与体系结构-设计模式-行为型软件设计模式-状态模式

五、状态模式

概念

与策略模式类似,状态模式将不同状态下的行为封装在不同的类中,每个类代表一个状态

状态模式的组成

  1. Context:定义了与客户程序的接口,它保持了一个concreteState的代表现在状态的实例
  2. State:定义了状态接口,它的各个子类封装了在各种不同状态下的行为
  3. ConcreteState子类:封装了在各种不同状态下的行为

类图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态发生变化时改变其行为,使得对象在不同状态下具有不同的行为。状态模式通过将状态封装成独立的类,并将状态之间的转换逻辑抽象出来,使得状态的变化对于使用者来说是透明的。

下面是一个简单的状态模式的代码示例,以说明其工作原理:

// 状态接口
interface State {void handleState();
}// 具体状态类:状态A
class ConcreteStateA implements State {public void handleState() {System.out.println("执行状态A的行为");}
}// 具体状态类:状态B
class ConcreteStateB implements State {public void handleState() {System.out.println("执行状态B的行为");}
}// 上下文类
class Context {private State currentState;public void setState(State state) {currentState = state;}public void performAction() {currentState.handleState();}
}// 示例
public class Main {public static void main(String[] args) {// 创建状态对象State stateA = new ConcreteStateA();State stateB = new ConcreteStateB();// 创建上下文对象Context context = new Context();// 设置初始状态为状态Acontext.setState(stateA);// 执行行为context.performAction();  // 输出:执行状态A的行为// 切换到状态Bcontext.setState(stateB);// 执行行为context.performAction();  // 输出:执行状态B的行为}
}

在上面的示例中,状态模式涉及三个主要角色:

  • 状态接口(State):定义了一个共同的接口,该接口表示一个状态,并声明了该状态下的行为。
  • 具体状态类(ConcreteState):实现了状态接口,表示具体的状态,每个具体状态类实现自己的行为逻辑。
  • 上下文类(Context):持有一个当前状态的引用,并调用当前状态的方法来执行相应的行为。

通过将状态封装成独立的类,并在上下文类中使用状态对象来执行行为,状态模式实现了状态和行为之间的解耦,使得状态的变化对于上下文类和使用者来说是透明的。在示例中,上下文类的行为会根据当前状态的不同而发生变化。

状态模式的优点包括:

  • 将状态转换逻辑封装在状态类中,使得新增或修改状态变得简单,符合开闭原则。
  • 避免了大量的条件语句,使代码结构清晰,易于理解和维护。
  • 将状态的变化与具体的行为分离,使得状态变化不会影响到其他部分的代码。

总之,状态模式可以提供一种简洁的方式来处理对象的状态变化,并将状态的行为与上下文类解耦,使得代码更加可扩展和易于维护。它在需要根据对象状态改变行为的场景中具有很好的应用价值。

策略模式与状态模式

策略模式(Strategy Pattern)和状态模式(State Pattern)是两种不同的行为型设计模式,它们都用于解决对象行为的变化和动态切换的问题,但在实现方式和应用场景上存在一些差异。

  • 策略模式关注的是不同算法或策略的替换和选择,它将每个策略封装在独立的类中,并使得这些策略对象可以相互替换,从而使得客户端可以在运行时选择不同的策略对象。策略模式通过封装不同的算法,使得算法可以独立于使用它们的客户端而变化。在策略模式中,客户端决定使用哪个策略,然后将控制权交给相应的策略对象。

  • 状态模式关注的是对象的状态变化,并在不同状态下提供不同的行为。它通过将对象的状态封装在独立的状态类中,并使得状态对象可以相互切换,从而实现不同状态下的不同行为。状态模式的关键在于将状态的切换和行为的实现分离开来,从而使得客户端可以根据对象的状态来选择相应的行为。在状态模式中,状态的切换是由上下文对象来控制的,上下文对象根据当前的状态选择相应的行为。

  • 虽然策略模式和状态模式都涉及到对象行为的变化和动态切换,但它们的重点和应用场景有所不同。策略模式主要用于选择和替换算法或策略,适用于需要在运行时根据不同情况选择不同算法的场景。而状态模式主要用于管理对象的状态变化和相应的行为切换,适用于对象具有多个状态,且每个状态下的行为有所不同的场景。

需要注意的是,策略模式和状态模式都可以提高代码的灵活性和可维护性,通过将变化的部分封装起来,使得变化不会影响到其他部分的代码。根据具体的需求和设计目标,选择合适的设计模式来解决问题是很重要的。

交通信号控制灯的实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

课程作业

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

数据增强之裁剪、翻转与旋转

文章和代码已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 数据增强 Data Augmentation裁剪Croptransforms.CenterCroptransforms.RandomCroptransforms.RandomResizedCroptra…

数据库的备份与恢复(超详细讲解)

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于MySQL数据库的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.数据库的备份与恢复是什么 二. …

stable diffusion 调试天坑 (setup.py)

第一次下载V1的stable diffusion (https://github.com/CompVis/stable-diffusion) 到本地调试,根据其要求创建了虚拟环境,自动运行了setup.py文件,长这样 from setuptools import setup, find_packagessetup(namelatent-diffusion,version0.…

Android Studio实现内容丰富的安卓博客发布平台

如需源码可以添加q-------3290510686,也有演示视频演示具体功能,源码不免费,尊重创作,尊重劳动。 项目编号078 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看博客列表…

RabbitMQ系列(8)--实现RabbitMQ队列持久化及消息持久化

概念:在上一章文章中我们演示了消费者宕机的情况下消息没有被消费成功后会重新入队,然后再被消费,但如何保障RabbitMQ服务停掉的情况下,生产者发过来的消息不会丢失,这时候我们为了消息不会丢失就需要将队列和消息都标…

MAYA传送带上放石头(新旧粒子系统)

播放试试 使用老的粒子系统 particleShape1.shuliangrand(0,5); particleShape1.daxiao<<rand(0.2,0.5),rand(0.2,0.5),rand(0.2,0.5)>>; particleShape1.xuanzhuan<<rand(360),rand(360),rand(360)>>; 使用新的粒子系统 粒子向后滑落 新粒子系统能进行…

33.RocketMQ之Broker启动源码

highlight: arduino-light Broker启动流程:BrokerStartup#main java public static void main(String[] args) { //手动指定了 nameServer start(createBrokerController(args)); } java public static BrokerController start(BrokerController controller)…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式&#xff0c;简单的使用postman构造http请求&#xff0c;进一步了解https, 学习https的加密过程&#xff0c;了解对称密钥与非对称密钥对于加密是如何进行的&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流…

数据结构算法题——链表

leetcode-2.两数之和 leetcode-2.两数之和 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数…

Linux调优–I/O 调度器

Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程&#xff0c;有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列&#xff1a;确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备&#xff0c;以此来减少磁盘寻道时间&#xff0c;从而提高系…

【PCIE】hot-reset和link disable

Hot reset 规则 如果上游伪端口&#xff08;Pseudo Port&#xff09;的任何一个通道连续接收到两个带有热复位位设置为1b、禁用链路位和回环位设置为0b的TS1有序集合&#xff0c;并且两个伪端口上的任何一个通道&#xff08;接收到TS1有序集合&#xff09;要么收到EIOS&#xf…

通俗易懂生成对抗网络GAN原理(二)

生成对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09;的原理 学习李宏毅机器学习课程总结。 前面学习了GAN的直观的介绍&#xff0c;现在学习GAN的基本理论。现在我们来学习GAN背后的理论。 引言 假设x是一张图片&#xff08;一个高维向量&#xff09;…