状态模式【行为模式C++】

news2024/9/20 22:49:35

1.概述

       状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。

  

2.结构

  • State(抽象状态类):定义一个接口用来封装与上下文类的一个特定状态相关的行为,可以有一个或多个行为。
  • ConcreteState(具体状态类):作为抽象状态类的子类,每个子类实现一个与上下文类的一个状态相关的行为。每个具体状态类对应上下文类的一个具体状态,不同的具体状态类其行为有所不同。
  • Context(上下文类):上下文类中维护一个具体状态的实例,通常有多种状态,负责具体状态的切换。

3.实现 

3.1 实例类比

       在日常生活和工作开发中都有状态的问题。你如说马路上的红绿灯,这三个灯光就属于三种状态。再比如说我使用的文档系统,通常有草稿、审阅和批发部三种状态。

       在以往的概念里,我们都会使用if...esle这类语句进行设计,但是这种设计一旦后期的需求发生了改变,那么维护起来相当的复杂!

       一个 文档Document类。 文档可能会处于 草稿Draft 、 ​ 审阅中Moderation和 已发布Published三种状态中的一种。 文档的 publish发布方法在不同状态下的行为略有不同:

  • 处于 草稿状态时, 它会将文档转移到审阅中状态。
  • 处于 审阅状态时, 如果当前用户是管理员, 它会公开发布文档。
  • 处于 已发布状态时, 它不会进行任何操作。  
3.2 具体实现
#include <iostream>
#include <typeinfo>


class Context;

//抽象状态类
class State {
	
protected:
	Context *context_;

public:
	virtual ~State() {
	}

	void set_context(Context *context) {
		this->context_ = context;
	}

	virtual void Status() = 0;
	virtual void Handle() = 0;
};

//上下文类
class Context {
	
private:
	State *state_;

public:
	Context(State *state) : state_(nullptr) {
		this->TransitionTo(state);
	}
	~Context() {
		delete state_;
	}

	void TransitionTo(State *state) {
		std::cout << "Context: Transition to " << typeid(*state).name() << ".\n";
		if (this->state_ != nullptr)
			delete this->state_;
		this->state_ = state;
		this->state_->set_context(this);
	}
	
	void Request1() {
		this->state_->Status();
	}
	void Request2() {
		this->state_->Handle();
	}
};

//已发布状态
class PublishedState : public State {
public:
	void Status() override {
		std::cout << "处于已发布状态.\n";
	}
	void Handle() override {
		std::cout << "结束...\n";
	}
};

//审阅中状态
class ModerationState : public State {
public:
	void Status() override {
		std::cout << "处于审阅中状态.\n";
	};

	void Handle() override {
		this->context_->TransitionTo(new PublishedState);
	}
};


//草稿状态
class DraftState : public State {
public:
	void Status() override {
		std::cout << "处于草稿状态.\n";
	};

	void Handle() override {
		this->context_->TransitionTo(new ModerationState);
	}
};


/**
 * The client code.
 */
void ClientCode() {
	Context *context = new Context(new DraftState);
	context->Request1();
	context->Request2();
	//
	context->Request1();
	context->Request2();
	//
	context->Request1();
	context->Request2();
	delete context;
}

int main() {
	ClientCode();
	return 0;
}
3.3运行结果

4.状态设计模式优缺点

优点:

      通常对有状态的对象进行编程,我们的解决方案是:思考可能存在的所有状态,然后使用 if-else 或 switch-case 语句来进行状态判断,然后再根据不同的状态进行不同的处理。

      大量的if...else的缺点很明显

  1. 违背开闭原则: 当增加一种状态的时候, 需要修改原来的逻辑
  2. 当状态很多的时候, 代码段很长, 臃肿, 不容易维护, 可扩展性差.

     状态模式可以很好地解决这个问题。封装了转换规则,消除了 if-else、switch-case 等条件判断语句,代码更有层次性,且具备良好的扩展力, 可维护性

缺点
  1. 状态模式的使用必然会增加系统类和对象的个数。
  2. 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
  3. 状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

5.应用场景

  1. 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。
  2. 对象的行为依赖于它的状态(例如某些属性值),状态的改变将导致行为的变化。


 

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

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

相关文章

家居网购项目(权限验证+事务管理)

文章目录 1.过滤器权限认证1.程序框架图2.web.xml3.编写AdminAuthorization4.编写MemberAuthorization5.细节6.结果展示1.未登录可以任意浏览商品2.点击添加购物车提示登录3.点击后台管理&#xff0c;提示管理员登录4.也做了其余资源的访问验证 2.事务管理1.思路分析2.重写JDBC…

AI大模型日报#0415:贾佳亚团队新作王炸、马斯克首款多模态大模型、ChatGPT to B

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 融合ChatGPTDALLE3&#xff0c;贾佳亚团队新作开源&#xff1a;识图推理生图一站解决 摘要: 贾佳亚团队推出了多模态模型Mini-Gem…

Android11应用安装未知来源的权限改动

最近开发的App需要下载安装另一个App。这就涉及到了app的安装代码。关于App的安装代码&#xff0c;写了不少&#xff0c;所以这一块觉得不是问题&#xff1a; 判断版本&#xff0c;Android8.0判断是否有未知来源安装全选&#xff0c;没有则打开未知来源安装权限设置界面去开启…

pdf预览空白问题解决。第一次预览正常,再重新打开就空白的问题。是因为cmaps没有更新

文章目录 问题描述问题解决问题总结曾经参考过的文章&#xff08;也未能解决&#xff09; 问题描述 我用的是pdfjs作为PDF预览工具使用。 预览有电子签章的PDF后(如下图的水印、签章)&#xff0c;再重新预览没有电子签章的PDF&#xff0c;就会空白。 如上图&#xff0c;第一个…

【Linux】磁盘管理和文件系统

目录 一、硬盘 1.硬盘结构 2.结构类型 二、MBR与磁盘分区 1.MBR主引导记录 2.磁盘分区结构 三、文件系统类型 四、linux系统添加并使用新硬盘的步骤 1.添加新的硬盘 2.刷新识别 3.进行分区 4.格式化&#xff0c;创建文件系统 5.挂载使用 一、硬盘 1.硬盘结构…

什么是人力资源成本?人力资源成本有哪些?

人力资源成本是企业运营成本的重要组成部分&#xff0c;对企业的财务状况和经营效率有着直接影响&#xff0c;如今企业面临着持续的成本压力和效率挑战。人力资源成本不仅直接关联企业的运营效率&#xff0c;还影响着企业的长期战略发展。因此&#xff0c;如何优化人力资源成本…

二、变量和引用

目录 2.1 什么是变量 2.2变量的命名 2.3 变量的类型 2.3.1 根据数据类型分类 2.3.2 根据作用域分类 2.4 变量的定义 2.5 shell中的引用 在程序设计语言中&#xff0c;变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理…

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难&#xff0c;可以转换为一维的字符串&#xff0c;在一维字符串中考虑较为简单&#xff0c;要注意本题中两个字符交换位置时只能是x和另外字符交换&#xff0c;本题另外一个难点在于如何…

借力社交裂变,Xinstall助你实现用户快速增长

在数字化时代&#xff0c;社交裂变已成为品牌获取新用户、扩大影响力的关键手段。然而&#xff0c;如何有效利用社交裂变&#xff0c;实现用户快速增长&#xff0c;却是许多品牌面临的挑战。今天&#xff0c;我们将为大家介绍一个强大的社交裂变引擎——Xinstall&#xff0c;它…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定&#xff0c;导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台&#xff0c;包括无人机app以及仿司空2的管理平台&#xff0c;集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

包装类初识泛型

一.包装类 在Java中, 基本类型不继承于Object类. 所以为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型.(包装类型相当于引用类型) 1.基本类型对应的包装类 byte -- Byteshort -- Shortint -- Integerlong -- Longfloat -- Floatdouble -- Doublech…

20V/3A大电流线性稳压器替代MIC29302/MIC29300

概述(替代MIC29302/MIC29300) PCD3942 是一款低压差稳压器&#xff0c;专为快速瞬态响应而优化。该装置能够提供 3A 的输出电流&#xff0c;典型压降为 325mV。工作静态电流为 1mA&#xff0c;关机时降至 1μA 以下&#xff0c;同时压差模式下静态电流控制良好。除了快速瞬态响…

lua学习笔记20(lua中一些自带库的学习)

print("*****************************lua中一些自带库的学习*******************************") print("*************时间***************") --系统时间 print(os.time()) --自己传入参数得到时间 print(os.time({year2011,month4,day5})) --os.data(&qu…

《HF经理》:二认知误区

一、管理者掌握重要权力&#xff1a; 二、全力来自管理者的职位&#xff1a; 三、管理者必须控制自己的直接下属&#xff1a; 对策&#xff1a;展示自己的品质&#xff0c;能力和影响力 四、管理者必须建立良好的个人关系&#xff1a; 五、管理这必须确保一切运行正常&…

深度学习框架

深度学习框架 1 引言 在当今技术加速发展的时代&#xff0c;深度学习已经成为了人工智能领域内最为引人注目的子领域之一。其在图像识别、自然语言处理、自动驾驶等多个行业中的成功应用&#xff0c;已经证明了深度学习在解决复杂问题方面的巨大潜力。然而&#xff0c;深度学习…

31、链表-K个一组反转链表

思路&#xff1a; 首先知道如何反转链表&#xff0c;其次找出每组的开始节点和结束节点&#xff0c;然后对于不足与k个的链表保持原状。 代码如下&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (headnull||k1){return head;}ListN…

一个小小逻辑符的错误使用,资损几万块?

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 这是一个真实事件&#xff0c;三年前老猫负责公司的支付资产业务。为了响应上级号召&#xff0c;加强国央企之间的合作&#xff0c;公司新谈了一个支付对接的渠道&#xff08;当然这个支付渠道其实很…

IT精英的财富攻略:五大策略揭秘

IT精英的财富攻略&#xff1a;五大策略揭秘 &#x1f4b8; 数字化浪潮汹涌&#xff0c;IT技能成为职场的金钥匙&#x1f511;&#xff0c;更为智慧的IT人打开了赚钱的大门。如果你身怀网络维护与安全管理的绝技&#xff0c;那么这五大策略&#xff0c;正是你蓄势待发的赚钱法宝…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Push Button的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Push Button的使用及说明 文章编号&#xff1…

09 - 镜像管理之:部署单点harbor

本次准备了3台机器&#xff1a;harbor-01、harbor-02、harbor-db&#xff0c;用于测试 单点模式、高可用模式 部署 harbor。 ip主机名规格操作系统说明192.168.217.136harbor-012c4gCentos7.9harbor 服务器&#xff0c;测试单点harbor192.168.217.135harbor-022c4gCentos7.9ha…