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

news2024/9/22 17:36:33

五、状态模式

概念

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

状态模式的组成

  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();

        // 设置初始状态为状态A
        context.setState(stateA);

        // 执行行为
        context.performAction();  // 输出:执行状态A的行为

        // 切换到状态B
        context.setState(stateB);

        // 执行行为
        context.performAction();  // 输出:执行状态B的行为
    }
}

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

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

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

状态模式的优点包括:

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

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

策略模式与状态模式

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

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

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

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

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

交通信号控制灯的实例

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

课程作业

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

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

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

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

相关文章

怎么用转转大师工具旋转PDF文件页面

有时候我们会在网上下载一下PDF格式文件,下载的PDF文件中可能会出现页面倒过来的情况,遇到这种情况我们需要先将PDF文件旋转到正确的角度才能继续阅读使用,那么有哪些方法可以快速旋转PDF页面呢? 可以使用转转大师工具快速旋转PD…

【知识产权-01】知识产权建设之专利那些事

在当今信息爆炸的时代,知识产权的保护变得尤为重要。专利是知识产权的一种重要形式,它是创新和发明的重要保护手段。几张图片向大家介绍专利的审查流程、不同方式的审查周期、专利检索以及技术交底书的基本知识,方便大家查阅。 审查流程 审查…

JavaWeb——HTTPS的加密流程

目录 一、使用对称加密 1、定义 2、加密/解密过程 二、使用非对称加密 1、对称加密弱点 2、非对称加密过程 (1)、定义 (2)、加密/解密过程 三、使用证书加密 1、非对称加密弱点 2、使用证书加密过程 (1&am…

k8s概念介绍

目录 一 整体架构和组件基本概念 1.1 组件 1.1.1 master节点 1.1.2 node节点 1.1.3 附加组件 二 资源和对象 2.1 资源分类 2.2 元数据资源 Horizontal Pod Autoscaler(HPA) PodTemplate LimitRange 2.3 集群资源 namespace Node ClusterRo…

树状数组详解

问题引入 为了做到对区间的快速查询,可能你会想到前缀和来优化这个查询,这样区间查询的话是O(1)的复杂度。但如果发生了单点更新,在之后的所有前缀和都要更新,修改的时间复杂度是O(n),并不能解决问题。 线段树 为了避…

自动化构建工具(Makefile/make)

什么是自动化构建工具 俗话说,会不会写Makefile可以从侧面表达出一个人是否具有完成大型项目的能力。试想一下,一个工程里面有数不尽的源文件,按照各自的,模块,类型放在不同的目录中,如果我要要去编译这个源文件&…

【真题解析】系统集成项目管理工程师 2021 年上半年真题卷(案例分析)

本文为系统集成项目管理工程师考试(软考) 2021 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析&#x…

FEW-SHOT CLASS INCREMENTAL LEARNING

Few-shot class-incremental learning (FSCIL) Neural Collaps有以下四个性质: 在第t个session的时候优化 其中,

研究人员发现新的Linux内核 “StackRot “特权升级漏洞

报道称,Linux内核中出现了一个新的安全漏洞,可能允许用户在目标主机上获得更高的权限。 该漏洞被称为StackRot(CVE-2023-3269,CVSS评分:7.8),影响Linux 6.1至6.4版本。迄今为止,没有…

Docker容器内无法解析域名:Temporary failure in name resolution

解决办法 说明:我的操作环境为CentOS 8,与CentOS 7使用命令完全一致。其他不同Linux系统版本命令可能会有所不同,请根据自己的系统版本使用对应命令,直接百度相关操作即可。 1. 检查主机网络设置。 1. 检查主机网络设置 cat /pr…

什么是数字化转型?企业数字化转型包括哪些方面?

什么是数字化转型?企业数字化转型包括哪些方面? 什么是数字化转型? 百度百科对于数字化转型的定义如下—— 数字化转型(Digital transformation)是建立在数字化转换(Digitization)、数字化升级…

98、基于STM32单片机指纹考勤机指纹识别签到系统设计(程序+原理图+PCB源文件+任务书+参考论文+开题报告+元器件清单等)

单片机类型选择 方案一:可以使用现在比较主流的单片机STC89C5单片机进行数据处理。这款单片机具有的特点是内存和51的单片机相比多了4KB内存,但是价格和51单片机一样。并且支持数据串行下载和调试助手。此款单片机是有ATMEL公司生产,可用5V电…

IPC 进程间通讯 (2)

目录 进程间通信的概念 进程间通信的目的 进程间通信的本质 进程间通信的分类 什么是管道 匿名管道 命名管道 system V共享内存 System V消息队列 System V信号量 system V IPC联系 进程间通信的概念 进程间通信简称IPC(Interprocess communication&…

赛效:怎么一键人像抠图

1:在人像抠图页面,点击下方的“本地上传”,将本地人像图片添加上去。 2:人像图上传成功后自动进入抠图页面,我们点击下方的“下载图片”,可将抠图后的人像图下载到电脑本地。 3:图片下载成功后&…

OpenCV对图片进行缩放处理

在下面的代码中,我会为你优化和解释这段程序: #include <opencv2/opencv.hpp>using namespace cv;int main() {// 读取源图片Mat srcImage = imread("../51_resize.jpg"

OpenCV使用pyrUp对图片进行放大处理

这段代码使用OpenCV读取图片,然后使用pyrUp函数将图片放大一倍,并显示原图和放大后的图像。以下是优化和注释版本的代码: #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {

亚马逊在日本增设11个配送设施,加强次日达物流网络

据外媒报道&#xff0c;亚马逊计划今年在日本开设11个新的配送设施&#xff0c;以强化其次日达送货服务的范围和提高用户购物的便利性。目前&#xff0c;该电商巨头在日本拥有超过50个配送设施。 亚马逊已经完成了2个&#xff0c;还有9个仍在建造中。该公司表示&#xff0c;它…

C语言柔性数组详解

柔性数组 C99中&#xff0c;结构体中最后一个元素允许是未知大小的数组&#xff0c;这叫做 【柔性数组】成员。 例1&#xff1a; struct node {int i;int num[]; // 柔性数组成员 };例2&#xff1a; struct node {int i;int num[0]; // 柔性数组成员 };柔性数组的特点&…

CMake 笔记

CMake 笔记 CMake 笔记 基础项目多个目录创建项目 链接库 用到的指令实验 使用自定义库 用到的指令实验 指定 C 标准CMake常见变量名 基础项目 实现一个CMakeLists.txt最简单是以下三步&#xff1a; # 最低 CMake 版本要求&#xff1a;指定项目所需的最低 CMake 版本 cma…

<网络编程>网络基础

目录 计算机网络背景 认识“协议”&#xff1a; TCP/IP五层模型 网络传输基本流程 不在一个局域网进行通信 了解网络发展背景&#xff0c;对局域网/广域网的概念认识 了解网络协议意义&#xff0c;重点理解TCP/IP五层结构 学习网络传输的基本流程&#xff0c;理解封装和…