2023-7-12-第十七式状态模式



🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之状态模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、状态模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

状态模式是一种行为设计模式,它允许对象在不同的内部状态下改变其行为。在状态模式中,对象根据自身的状态选择不同的策略或算法来完成特定的任务。这种模式支持将复杂的条件分支语句转化为一组相互独立的状态类,并使用面向对象的方式进行管理和切换。

状态模式的核心概念包括三个角色:上下文(Context)、抽象状态(State)和具体状态(Concrete State)。上下文是包含状态的对象,它可以根据当前的状态委派给不同的具体状态处理具体的行为。抽象状态是定义了一个接口或基类,用于描述状态的共同行为。具体状态则实现了抽象状态的接口,在不同的状态下提供独立的行为实现。

通过使用状态模式,我们可以将复杂的条件逻辑分解成一系列简单的状态类,使得代码更加清晰、可扩展和易于维护。此外,状态模式还符合开闭原则,因为我们可以通过添加新的具体状态类来扩展系统的功能,而无需修改上下文类或其他现有的状态类。

总结来说,状态模式通过将对象的行为与其内部状态相联系,提供了一种优雅的方式来处理对象的状态变化和相应的行为变化。


🐱‍🐉二、状态模式实现

在C++中,可以使用类和多态性来实现状态模式。下面是一个简单的示例:

首先,创建一个抽象状态类(State)作为基类,定义了一个纯虚函数用于执行特定状态下的操作。

class State {
public:
    virtual void doAction() = 0;
};

接下来,创建具体状态类(ConcreteState),它们继承自抽象状态类,并实现了相关的操作。

class ConcreteStateA : public State {
public:
    void doAction() override {
        // 执行状态A下的操作
    }
};

class ConcreteStateB : public State {
public:
    void doAction() override {
        // 执行状态B下的操作
    }
};

然后,创建上下文类(Context),该类包含一个指向当前状态对象的指针,并提供了一些方法来切换状态和执行操作。

class Context {
private:
    State* currentState;

public:
    void setState(State* state) {
        currentState = state;
    }

    void performAction() {
        currentState->doAction();
    }
};

最后,我们可以使用这些类来演示状态模式的工作原理。

int main() {
    Context context;
    ConcreteStateA stateA;
    ConcreteStateB stateB;

    context.setState(&stateA);
    context.performAction(); // 执行状态A下的操作

    context.setState(&stateB);
    context.performAction(); // 执行状态B下的操作

    return 0;
}

在上述示例中,上下文(Context)根据当前的状态对象执行相应的操作。通过切换不同的状态对象,上下文可以在运行时改变其行为。这种方式使得状态和行为的关系更加灵活和可扩展,并且能够避免使用大量的条件语句。


🎉三、模块之间的关系

状态模式通常涉及三个主要组件:上下文(Context)、抽象状态(Abstract State)和具体状态(Concrete State)。这些组件之间的关系如下:

  1. 上下文(Context):上下文是包含状态的对象,它维护一个对当前状态对象的引用。上下文提供了一个接口,允许客户端代码设置、获取和切换状态。上下文将实际的操作委派给当前状态对象来执行。

  2. 抽象状态(Abstract State):抽象状态是一个接口或基类,它定义了状态对象的共同行为。这个接口通常包含了在不同状态下需要实现的方法。

  3. 具体状态(Concrete State):具体状态是抽象状态的实现类。每个具体状态类都代表系统中的一个特定状态,并定义了在该状态下应该进行的操作。

在状态模式中,上下文通过持有一个抽象状态对象的引用来维护当前状态,并将请求委托给当前状态对象处理。当状态发生变化时,上下文对象会更新其状态引用,从而切换到不同的具体状态,以便调用相应状态的方法。

状态模式的目标是将与特定状态相关的行为局部化,并使得状态之间的转换更加灵活和可扩展。通过使用状态模式,不同模块之间的关系可以通过上下文和具体状态之间的交互来协调,从而实现更好的封装和解耦。上下文对象可以专注于管理状态,并在需要时委托给相应的状态处理特定的行为。这种模式使得系统更加可维护、可扩展和易于理解。


🐱‍🚀四、注意事项

在使用状态模式时,以下是一些需要注意的事项:

  1. 合适的场景:状态模式适用于当对象的行为依赖于其内部状态,并且该行为在运行时可能发生变化的情况。如果对象有多个状态和相应的操作,并且这些状态之间的转换比较复杂,那么状态模式可以提供一种清晰、可维护的解决方案。

  2. 增加新状态:状态模式支持增加新的具体状态类来扩展系统的功能。因此,在设计状态模式时要考虑到可能的状态增加,并将相应的行为封装在新的具体状态类中。

  3. 上下文与状态的交互:在状态模式中,上下文与具体状态之间的交互是关键。上下文负责切换当前状态并委托请求给当前状态对象处理。确保在上下文中正确管理状态的转换以及对当前状态进行引用的更新。

  4. 状态切换的触发机制:决定何时进行状态切换通常取决于具体的业务逻辑或条件。可以通过事件、用户输入、时间、特定条件等方式来触发状态切换。确保状态切换的触发机制与应用程序的需求相匹配,并避免过于复杂的状态转换逻辑。

  5. 共享状态数据:在状态模式中,具体状态类之间可能需要共享一些状态数据。确保在状态对象之间正确共享和传递必要的状态信息,以便实现正确的行为。

  6. 考虑上下文的复杂性:如果上下文对象需要管理多个状态并且涉及复杂的状态转换逻辑,那么可能需要进一步组织和设计上下文对象,以便更好地管理状态和行为。

  7. 谨慎使用过多的状态:尽管状态模式可以提供灵活的状态管理,但过多的状态可能会导致代码复杂性增加。在设计状态模式时,仔细考虑所需的状态数量,并确保每个状态都有明确的目的和职责。

通过注意以上事项,可以更好地应用状态模式,并实现一个清晰、可扩展的状态管理机制。


🎂五、使用场景

状态模式适用于以下情况和使用场景:

  1. 对象的行为取决于其内部状态:当对象的行为需要根据其内部状态的变化而变化时,可以使用状态模式。例如,一个网络连接对象的行为可能取决于其当前的连接状态(已连接、已断开连接、等待连接等)。

  2. 有多个状态和相应的操作:如果对象有多个状态,并且每个状态都有不同的行为或操作集合,那么状态模式可以提供一种优雅的方式来管理这些行为。状态模式将相关状态的行为封装在具体状态类中,使得状态之间的切换更加清晰和可维护。

  3. 避免大量的条件语句:状态模式可以用于减少大量的条件语句。将复杂的条件分支转换为一组相互独立的状态类可以使代码更简洁、易读和易于修改。每个状态类只关注自己的行为,从而提高了代码的可扩展性和可维护性。

  4. 状态转换的灵活性和可扩展性:状态模式允许添加新的具体状态类来扩展系统的功能。通过增加新的状态类,可以在不影响其他状态类的情况下引入新的行为。这种灵活性和可扩展性使得状态模式在需要频繁添加、修改或调整状态的场景中非常有用。

  5. 分离状态相关的行为:状态模式可以帮助将与特定状态相关的行为集中在单独的状态类中。这种分离使得代码更加模块化和可测试,同时也提供了更好的代码重用性。

  6. 减少条件判断的复杂度:状态模式可将复杂的状态转换逻辑放置到具体状态类中,从而简化上下文对象的代码。通过将状态切换逻辑委托给状态类处理,可以减少上下文对象中的条件判断,使代码更加清晰和可维护。

总的来说,状态模式适用于当对象的行为随着内部状态的变化而变化,并且需要通过封装、分离和管理状态来避免大量的条件语句时。它提供了一种灵活、可扩展的方式来处理复杂的状态转换和相应的行为。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于状态模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么单片机可以直接烧录程序的原因是什么?

单片机(Microcontroller)可以直接烧录程序的原因主要有以下几点: 集成性:单片机是一种高度集成的芯片,内部包含了处理器核心(CPU)、存储器(如闪存、EEPROM、RAM等)、输入…

Linux: USB Gadget 驱动简介

文章目录 1. 前言2. 背景3. USB Gadget 驱动3.1 什么是 USB Gadget 驱动?3.2 USB Gadget 驱动框架3.3 USB 设备控制器(UDC) 驱动3.3.1 USB 设备控制器(UDC) 驱动 概述3.3.2 USB 设备控制器(UDC) 驱动示例 3.4 USB Gadget Function 驱动3.5 USB Gadget 驱动3.5.1 USB…

微服务系列文章之 nginx负载均衡

nginx负载均衡 负载均衡建立在现有网络结构之上,提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽,增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 随着网站的发展,服务器压力越来越大,我们可能首先会将数…

CentOS 安装字体 微软雅黑

fc-list命令查看已经安装的字体 fc-list :langzh命令可以查看已安装的中文字体 找到windows系统里面的字体 上传到服务器 /usr/share/fonts/winFonts 下,winFonts目录是自己建立的,名称无要求 如果C:\Windows\Fonts下的字体没法直接传输将这个文件夹复…

东方通信基于 KubeSphere 的云计算落地经验

作者:周峰 吴昌泰 公司简介 东方通信股份有限公司(以下简称“东方通信”)创立于 1958 年,是一家集硬件设备、软件、服务为一体的整体解决方案提供商。公司于 1996 年成功改制上市,成为上海证交所同时发行 A 股和 B 股…

jenkins手把手教你从入门到放弃01-jenkins简介(详解)

一、简介 jenkins是一个可扩展的持续集成引擎。持续集成,也就是通常所说的CI(Continues Integration),可以说是现代软件技术开发的基础。持续集成是一种软件开发实践, 即团队开发成员经常集成他们的工作,通…

Ribbon 负载均衡服务调用

文章目录 1 SpringCloud Load Balance2 总结:3 Ribbon工作流程:4 自定义Ribbon 负载均衡算法:4.1 iRule接口:4.2 Ribbon自带的负载均衡算法:4.3 负载均衡算法替代:4.3.1、在非启动类包及子包下创建配置类4.3.2、定义4.…

网络虚拟化相关的Linux接口介绍

Linux拥有丰富的网络虚拟化功能,能被虚拟机,容器还有云网络使用。在这篇文章中,我会给出所有通用网络虚拟化接口的简要介绍。没有代码分析,只有简短的接口介绍和在Linux上的使用操作。这系列接口都可以使用ip link命令实现。 这篇…

Spring核心和设计思想(1)

1.Spring是什么? 我们通常说的Spring指的是Spring FrameWork(Spring 框架),它是一个开源框架,有着活跃而庞大的社区,这就是它长久不衰的原因。Spring支持广泛的应用场景,它让Java企业级的应用程…

用html+javascript打造公文一键排版系统5:二级标题排版

公文中二级标题的一般以(X)标注(其中X为由"一二三四五六七八九十"中的字符组成的字符串),用楷体字加粗。 首先我们要判断一段文字是否包含二级标题,最简单的方法 就是判断文字中的头一个字符是否…

【Linux】Linux下的项目自动化构建工具——make和makefile

❤️前言 大家好,好久不见!今天小狮子为大家带来的文章是一篇关于Linux下的项目自动化构建工具——make和makefile的博客,希望能帮助到大家。 正文 当我们进行涉及多文件的工程开发时,我们需要对很多不同类型、不同功能&#xff…

基于R语言Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合方法与应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

XUbuntu22.04之解决蓝牙鼠标不停掉线问题(追凶过程)(一百八十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Linux网络基础 — 网络层

目录 IP协议 IP协议报头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 补充 网络层 在复杂的环境中确定一个合适的路径。 IP协议 ip具有将数据从 主机A 跨网络送到 主机B 的能力。 主机: 配有IP地址,但是不进行路由控制的设备…

【Redis】Transaction(事务)

🎯前言 Redis事务是一个组有多个Redis命令的集合,这些命令可以作为一个原子操作来执行。 Redis事务通常用于以下两种情况: 保证操作的原子性:在多个命令的执行过程中,如果有一个命令执行失败,整个事务都需…

挖矿记录+解决方案:利用GitLab组件对服务器进行挖矿导致CPU占用200%

文章目录 什么是云服务器挖矿?事件记录事件分析产生影响解决方案后期预防什么是云服务器挖矿? 云服务器挖矿是指利用云服务器从事赚取比特币的活动。比特币是一种虚拟数字货币,挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程。 用于…

【字节流】写数据的三种方式以及两个问题

字节流写数据 1.字节流写数据三种方式 void write(int b):将指定的字节写入此文件输出流一次写一个字节数据 package com.bytestream; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamDemo02 {public static void ma…

融云「北极星」数据监控平台:数据可视通晓全局,精准分析定位问题

↑ 点击预约“融云北极星”直播↑ 点击预约“实时社区”直播 近期,融云“北极星”数据系统完成功能迭代,新模块“数据监控平台”正式“履新上任”。关注【融云全球互联网通信云】了解更多 点击图片查看更多详情 此前,“北极星”系统主要为客…

水声功率放大器的作用是什么

水声功率放大器是一种专门用于水声设备的高功率电子设备,主要用于提升水下信号的传输距离和保证语音清晰度。它的作用在水下通信、水下测量、海洋科学等领域都非常重要。 其主要作用有以下几个方面: 增强信号传输距离 水声信号在水中传播会受到各种因素的…

有哪些好用的远程传输大文件的软件

随着网络技术的日益进步和普及,大文件远程传输已经成为了人们生活和工作中必不可少的一部分。然而,在远程传输大文件的过程中,经常会遇到传输速度慢、容易受到干扰等问题,因此需要一款高效、稳定、安全的大文件远程传输软件来解决…