状态模式(State)

news2025/1/25 4:39:38

参考:

[状态设计模式 (refactoringguru.cn)](https://refactoringguru.cn/design-patterns/mediator)

4. 状态模式 — Graphic Design Patterns (design-patterns.readthedocs.io)

design-patterns-cpp/State.cpp at master · JakubVojvoda/design-patterns-cpp · GitHub

文章目录

    • 一、什么是状态模式?
    • 二、实现
    • 三、优缺点
      • 优点
      • 缺点
    • 四、适用环境
    • 五、模式应用
    • 六、模式扩展
      • 共享状态

一、什么是状态模式?

状态模式定义:允许一个对象在其内部状态改变时改变它的行为,使其看上去就像改变了自身所属的类一样。

在这里插入图片描述

二、实现

状态(State)模式包含以下主要角色:

1、上下文(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
2、状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
3、具体状态(Concrete State):实现抽象状态定义的接口。

在这里插入图片描述

/*
 * C++ Design Patterns: State
 * Author: Jakub Vojvoda [github.com/JakubVojvoda]
 * 2016
 *
 * Source code is licensed under MIT License
 * (for more details see LICENSE)
 *
 */

#include <iostream>

/*
 * State
 * defines an interface for encapsulating the behavior associated
 * with a particular state of the Context
 */
class State
{
public:
  virtual ~State() { /* ... */ }
  virtual void handle() = 0;
  // ...
};

/*
 * Concrete States
 * each subclass implements a behavior associated with a state
 * of the Context
 */
class ConcreteStateA : public State
{
public:
  ~ConcreteStateA() { /* ... */ }
  
  void handle()
  {
    std::cout << "State A handled." << std::endl;
  }
  // ...
};

class ConcreteStateB : public State
{
public:
  ~ConcreteStateB() { /* ... */ }
  
  void handle()
  {
    std::cout << "State B handled." << std::endl;
  }
  // ...
};

/*
 * Context
 * defines the interface of interest to clients
 */
class Context
{
public:
  Context() : state() { /* ... */ }
  
  ~Context()
  {
    delete state;
  }
  
  void setState( State* const s )
  {
    if ( state )
    {
      delete state;
    }
    state = s;
  }
  
  void request()
  {
    state->handle();
  }
  // ...

private:
  State *state;
  // ...
};


int main()
{
  Context *context = new Context();
  
  context->setState( new ConcreteStateA() );
  context->request();
  
  context->setState( new ConcreteStateB() );
  context->request();
  
  delete context;
  return 0;
}

三、优缺点

优点

  • 封装了转换规则。
  • 开闭原则。 无需修改已有状态类和上下文就能引入新状态。
  • 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

缺点

  • 如果状态机只有很少的几个状态, 或者很少发生改变, 那么应用该模式可能会显得小题大作。

四、适用环境

  • 对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。
  • 代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态。

五、模式应用

状态模式在工作流或游戏等类型的软件中得以广泛使用,甚至可以用于这些系统的核心功能设计,如在政府OA办公系统中,一个批文的状态有多种:尚未办理;正在办理;正在批示;正在审核;已经完成等各种状态,而且批文状态不同时对批文的操作也有所差异。使用状态模式可以描述工作流对象(如批文)的状态转换以及不同状态下它所具有的行为。

六、模式扩展

共享状态

  • 在有些情况下多个环境对象需要共享同一个状态,如果希望在系统中实现多个环境对象实例共享一个或多个状态对象,那么需要将这些状态对象定义为环境的静态成员对象。

  • 简单状态模式与可切换状态的状态模式

    1. 简单状态模式:简单状态模式是指状态都相互独立,状态之间无须进行转换的状态模式,这是最简单的一种状态模式。对于这种状态模式,每个状态类都封装与状态相关的操作,而无须关心状态的切换,可以在客户端直接实例化状态类,然后将状态对象设置到环境类中。如果是这种简单的状态模式,它遵循“开闭原则”,在客户端可以针对抽象状态类进行编程,而将具体状态类写到配置文件中,同时增加新的状态类对原有系统也不造成任何影响。
    2. 可切换状态的状态模式:大多数的状态模式都是可以切换状态的状态模式,在实现状态切换时,在具体状态类内部需要调用环境类Context的setState()方法进行状态的转换操作,在具体状态类中可以调用到环境类的方法,因此状态类与环境类之间通常还存在关联关系或者依赖关系。通过在状态类中引用环境类的对象来回调环境类的setState()方法实现状态的切换。在这种可以切换状态的状态模式中,增加新的状态类可能需要修改其他某些状态类甚至环境类的源代码,否则系统无法切换到新增状态。

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

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

相关文章

31-Vue之ECharts-饼图

ECharts-饼图前言饼图的特点饼图的基本实现饼图的常见效果显示数值南丁格尔图选中效果圆环前言 本篇来学习饼图的实现 饼图的特点 饼图可以很好地帮助用户快速了解不同分类的数据的占比情况 饼图的基本实现 ECharts 最基本的代码结构准备数据准备配置项 在 series 下设置 …

去年今日我凭借这份文档,摇身一变成了被BAT看中的幸运儿

我足够努力&#xff0c;当然也足够幸运。现在把这份文档和这份幸运分享给你们。 JVM 线程 JVM内存区域 JVM运行时内存 垃圾回收与算法 JAVA 四种引用类型 GC分代收集算法 VS 分区收集算法 GC垃圾收集器 JAVA IO/NIO JVM 类加载机制 由于篇幅限制小编&#xff0c;细节内…

使用Tensorflow2和Pytorch实现线性回归

使用Tensorflow2和Pytorch实现线性回归步骤Tensorflow2代码效果Pytorch代码效果步骤 准备步骤&#xff1a; 1. 创建数据集 2. 设置超参数 3. 创建模型(函数) 4. 选择损失函数 5. 选择优化器 训练步骤&#xff1a; 6. 通过模型(函数)前向传播 7. 计算损失 8. 对超参数求梯度 9…

【人脸识别】人脸实时检测与跟踪【含GUI Matlab源码 673期】

⛄一、简介 如何在视频流中检测到人脸以及人脸追踪。对象检测和跟踪在许多计算机视觉应用中都很重要&#xff0c;包括活动识别&#xff0c;汽车安全和监视。所以这篇主要总结MATLAB的人脸检测和跟踪。 首先看一下流程。检测人脸——>面部特征提取——>脸部追踪。 ⛄二、…

springcloud3 EurekaClient集群的搭建2

一 概述 1.1 概述 本文主要是搭建集成eurekaserver的几个客户端&#xff0c;即服务提供者&#xff0c;消费者。架构图如下所示 1.2 使用eureka整合的优点 使用Eureka管理注册的好处&#xff1a;消费者直接调用服务名称而不用在关系地址和端口&#xff0c;且该服务还有负载均…

[附源码]Nodejs计算机毕业设计基于的仓库管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

DBCO-PEG-Mesylate,Mesylate-PEG-DBCO,甲磺酸酯聚乙二醇环辛炔

一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; DBCO-PEG-Mesylate属于高分子PEG&#xff0c;甲磺酸酯是甲磺酸与醇酯化而成的酯类化合物。“点击化学"一般由叠氮化物&#xff08;azide&#xff09;和炔烃&#xff08;…

React - 组件样式模块化

React - 组件样式模块化一. 存在的问题二. 解决样式冲突&#xff0c;组件样式模块化当多个组件使用相同类名时&#xff0c;设置的css样式会存在冲突渲染。 一. 存在的问题 例如有Page1、Page2两个组件&#xff0c;在 Page1 组件引入了css样式&#xff0c;Page2 组件未引入。 组…

用Excel写个摸球模拟器玩玩

用Excel写个摸球模拟器玩玩背景代码实现相关资料背景 最近对象有个需求&#xff0c;想要帮忙写个程序&#xff0c;实现功能&#xff1a;模拟两种颜色的球&#xff0c;随机摸球N次后&#xff0c;摸到不同颜色的次数。 考虑到非程序员的环境配置问题&#xff0c;直接用Excel中的…

【配电网规划】SOCPR和基于线性离散最优潮流(OPF)模型的配电网规划( DNP )(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

深兰科技接连斩获工业设计奖!出众产品设计,助AI产品一路领先

十余年来&#xff0c;第三代AI浪潮奔腾汹涌&#xff0c;中国AI产业从全面追赶到部分实现超越。两年前&#xff0c;AI更是正式成为国家七大新基建之一。从国家战略到基础设施&#xff0c;AI正全面地从文件走向现实&#xff0c;国内人工智能的市场规模也迅速扩大。这背后&#xf…

简易聊天室代码分享 js+socket.io

先言 这我以前写的&#xff0c;这里就是单纯分享下代码&#xff0c;不算正经文章。效果如下&#xff0c;前端用一个单html文件。然后后端用node.js和socket.io&#xff0c;也是只用一个单js文件就好。这里可以看下代码的实现逻辑就好&#xff0c;因为来连数据库才能运行的。有…

HTML网页设计制作大作业 基于HTML+CSS+JavaScript实现炫丽口红网化妆品网站(10页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

《天天学敏捷:Scrum团队转型记》读书笔记

读书给人以快乐、给人以光彩、给人以才干。 —— 培根 基本信息 作者&#xff1a;杨蕾&#xff0c;郑江著推荐值&#xff1a;76.7%微信读书&#xff1a;天天学敏捷&#xff1a;Scrum团队转型记 收获 & 思考 阅读目标&#xff1a;提前明确目标&#xff0c;有助于提升阅读效…

营销新赛道:虚拟数字人

2021年10月Facebook改名Meta&#xff0c;引爆全球范围的元宇宙热&#xff0c;和Web 3.0相比较&#xff0c;元宇宙是一个完整的生态&#xff0c;而Web 3.0特指一种交互方式和实现方法&#xff0c;两者之间的关系类似于移动互联网与HTML 5。在元宇宙生态下&#xff0c;营销的3要素…

[附源码]Python计算机毕业设计-高校人事管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Vue--》路由vue-router的使用讲解

目录 路由简述 vue-router vue-router的安装配置与使用 路由重定向 嵌套路由 嵌套路由重定向 命名路由 动态路由 路由简述 路由&#xff08;英文&#xff1a;router&#xff09;就是对应关系。单页面应用程序&#xff08;SPA&#xff09;指的是一个web网站只有唯一一个…

故障分析 | MySQL死锁案例分析

作者&#xff1a;杨奇龙 网名“北在南方”&#xff0c;资深 DBA&#xff0c;主要负责数据库架构设计和运维平台开发工作&#xff0c;擅长数据库性能调优、故障诊断。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转…

[附源码]Python计算机毕业设计高校教材网上征订系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

密码改造技术路径大比拼--“免”改造太理想,“重”改造太复杂,“易”改造是王道

随着《密码法》的颁布施行&#xff0c;密码产业进入爆发式增长期。市场用户侧、供给侧、监管侧对于“密评密改”的标准路径和部署方式共识度低&#xff0c;有唱专业的&#xff0c;有唱商业的&#xff0c;有唱便捷的&#xff0c;有唱可持续发展的&#xff0c;有唱单品的&#xf…