C++设计模式——State状态模式

news/2024/12/22 18:13:30/

一,状态模式的定义

状态模式是一种行为型设计模式状态模式允许对象在内部状态发生切换时改变它自身的行为。

状态模式的主要目的是将复杂的状态切换逻辑抽象化为一组离散的状态类,使代码结构更加清晰和易于维护。

状态模式将对象的行为封装到不同的状态类中,从而在应用程序的状态发生改变时,会自动切换到对应的状态类。状态模式使得状态的切换被表现为类对象的切换。

状态模式在现实生活中的抽象实例:

交通信号灯:交通信号灯有红灯、绿灯等多种状态。每个状态都定义了不同的行驶规则。

购物流程:用户在购物流程中有多种状态,例如浏览商品、添加购物车、填写收货地址等。

游戏角色:游戏角色可以处于不同的状态,例如行走、攻击等,玩家可以让角色在不同状态间切换。

订单状态:每个订单包含待支付、已支付、已发货、已完成等多个状态。

二,状态模式的结构

状态模式主要包含以下组件:

1.状态上下文(Context):

状态上下文是一个持有状态对象的类,它持有一个状态对象的引用,对外提供了切换状态的统一接口。

2.抽象状态(State):

它定义了在特定状态下对象的行为,声明了对象在某状态下的操作。

3.具体状态(Concrete State):

包含对抽象状态的具体实现。每个具体状态类代表着一种具体状态,并包含了该状态对应的具体操作。

组件之间的工作步骤如下:

1.初始化状态对象,利用状态对象来初始化状态上下文。

2.状态上下文设置当前状态。

3.状态上下文调用当前状态对应的处理逻辑。

4.状态上下文开始切换状态,并引用另一个状态对象。

对应UML类图:

三,状态模式代码样例

#include <iostream>class State {
public:virtual ~State() {}virtual void handle() = 0;
};class ConcreteStateA: public State {
public:void handle() override {std::cout << "Handling state A" << std::endl;}
};class ConcreteStateB: public State {
public:void handle() override {std::cout << "Handling state B" << std::endl;}
};class Context {
private:State* state;
public:Context(State* state) : state(state) {}~Context() {delete state;}void setState(State* state) {delete this->state;this->state = state;}void request() {state->handle();}
};int main() {State* stateA = new ConcreteStateA();State* stateB = new ConcreteStateB();Context context(stateA);context.request();context.setState(stateB);context.request();return 0;
}

运行结果:

Handling state A
Handling state B

四,状态模式的应用场景

网络管理:网络编程中经常涉及多种网络状态切换,比如发送请求、断开连接等。

分布式系统:分布式系统的节点可能有多种工作状态,比如就绪、运行、故障恢复等。

游戏开发:游戏角色的行为可能会随着生命值、等级、装备的不同而变化。

图形界面开发:在GUI应用中,组件有多种状态,比如按钮有"正常"、"按下"等状态。

五,状态模式的优缺点

状态模式的优点:

修改灵活,当系统需求变化时,可以方便地添加、删除或修改状态,无需修改大量代码。

扩展性强,方便添加新的状态。

代码的结构很清晰,每个状态类专门负责一种特定的行为。

对外隐藏细节,外部只需要关心当前的状态,不需要知道状态转换的细节。

状态模式的缺点:

如果状态很多,会导致类的数量增加。

有些状态处理场景会导致频繁创建和销毁状态对象,带来额外性能开销。

用类对象来表示状态,容易引起过度封装,导致代码结构复杂。

六,代码实战

Demo1:基于状态模式模拟的交通信号灯

#include <iostream>
#include <thread>class State {
public:virtual void handleState() = 0;
};class GreenState: public State {
public:void handleState() override {std::cout << "Traffic Light: Green!" << std::endl;}
};class RedState: public State {
public:void handleState() override {std::cout << "Traffic Light: Red!" << std::endl;}
};class YellowState: public State {
public:void handleState() override {std::cout << "Traffic Light: Yellow!" << std::endl;}
};class TrafficLight {
private:State* currentState;
public:TrafficLight(State* initialState){currentState = initialState;}void changeState(State* newState) {currentState = newState;}void operate() {currentState->handleState();}
};int main() {GreenState greenState;RedState redState;YellowState yellowState;TrafficLight trafficLight(&greenState);trafficLight.operate();trafficLight.changeState(&yellowState);trafficLight.operate();trafficLight.changeState(&redState);trafficLight.operate();return 0;
}

运行结果:

Traffic Light: Green!
Traffic Light: Yellow!
Traffic Light: Red!

Demo2:基于状态模式模拟的网络管理

#include <iostream>
class State;class TCPConnection {
public:TCPConnection();void open();void close();void setState(State* newState);
private:State* currentState;
};class State {
public:virtual void open(TCPConnection* connection) = 0;virtual void close(TCPConnection* connection) = 0;
};class ReOpenState: public State{
public:void open(TCPConnection* connection) override {std::cout << "[State3]Network is already ReOpen" << std::endl;}void close(TCPConnection* connection) override {std::cout << "[State3]Closing Network" << std::endl;}
};class ClosedState: public State{
public:void open(TCPConnection* connection) override {std::cout << "[State2]Opening Network" << std::endl;connection->setState(new ReOpenState());}void close(TCPConnection* connection) override {std::cout << "[State2]Network is already closed" << std::endl;}
};class OpenState: public State{
public:void open(TCPConnection* connection) override {std::cout << "[State1]Network is already open" << std::endl;}void close(TCPConnection* connection) override {std::cout << "[State1]Closing Network" << std::endl;connection->setState(new ClosedState());}
};TCPConnection::TCPConnection() : currentState(new OpenState()) {}
void TCPConnection::open() {currentState->open(this);
}
void TCPConnection::close() {currentState->close(this);
}
void TCPConnection::setState(State* newState) {currentState = newState;
}int main() {TCPConnection tcpConnection;tcpConnection.open();tcpConnection.close();tcpConnection.open();tcpConnection.close();return 0;
}

运行结果:

[State1]Network is already open
[State1]Closing Network
[State2]Opening Network
[State3]Closing Network

七,参考阅读

https://www.javaskool.com/state-design-pattern/

https://www.geeksforgeeks.org/state-design-pattern/

https://softwarepatterns.com/cpp/state-software-pattern-cpp-example

https://www.codeproject.com/Articles/1087619/State-Machine-Design-in-Cplusplus-2


http://www.ppmy.cn/news/1524430.html

相关文章

继收购西门子物流自动化后,丰田又投资一家AGV公司,智能物流版图已极其夸张...

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 继成功将西门子物流自动化(机场物流业务)纳入麾下后&#xff0c;丰田并未停下其征伐的步伐&#xff0c;而是再度出手&#xff0c;与新兴科技巨头Gideon携手&#xff0c;共同绘制了一幅…

AI 产品经理:2024 年职场新航标 ——AI 产品经理的未来与契机

前言 这两年&#xff0c;AI 骤然“火”了起来&#xff0c;可谓出现了重大“转折”。就在这短短两年间&#xff0c;全球各大“大厂”几乎在同一时间争先恐后地跟进 AI 技术。从 ChatGPT 发布起&#xff0c;谷歌、Facebook、亚马逊等纷纷紧跟其后&#xff0c;国内的百度、腾讯、…

【笔记】一维动态规划DP

文章目录 动态规划DPDP解题步骤例子1lanqiao3367 破损的楼梯题目描述输入格式输出格式解题思路代码 lanqiao3423 安全序列题目描述输入格式输出格式解题思路代码 动态规划DP 动态规划用于解决具有重叠子问题、最优子结构特征的问题。 重叠子问题&#xff1a;子问题是原问题的…

安装与pytorch不同cuda版本的bitsandbytes

由于历史遗留问题&#xff0c;虽然我的cuda版本是11.8&#xff0c;但是我的torch对应cuda版本是12.1&#xff0c;安装bitsandbytes后&#xff0c;就会抛出以下报错&#xff1a; Could not load bitsandbytes native library: libcusparse.so.12: cannot open shared object fi…

Flask如何传递URL参数

在Flask中&#xff0c;传递URL参数是一种常见且强大的功能&#xff0c;它允许你的Web应用根据URL中的不同部分来动态地生成内容或执行不同的操作。虽然直接撰写5000字来详细解释这一功能可能过于冗长&#xff0c;但我可以提供一个简明而全面的概述&#xff0c;包括基本概念、使…

ISAC: Toward Dual-Functional Wireless Networks for 6G and Beyond【论文阅读笔记】

此系列是本人阅读论文过程中的简单笔记&#xff0c;比较随意且具有严重的偏向性&#xff08;偏向自己研究方向和感兴趣的&#xff09;&#xff0c;随缘分享&#xff0c;共同进步~ Integrated Sensing and Communications: Toward Dual-Functional Wireless Networks for 6G and…

AI客服机器人开启企业客户服务新纪元

随着人工智能(AI)技术的迅猛发展&#xff0c;使得AI客服机器人走进了我们的视野&#xff0c;成为提高客户满意度和业务效率的不二法宝。这些智能机器人不仅能够处理海量信息&#xff0c;还能为客户提供个性化的服务体验。 一、AI客服机器人的基本原理 AI客服机器人是基于人工智…

探索非局部均值滤波在椒盐噪声去除中的应用

在图像处理领域&#xff0c;椒盐噪声是一种常见的干扰&#xff0c;它会导致图像出现随机的黑白像素点&#xff0c;严重影响图像质量。为了解决这一问题&#xff0c;本文将介绍一种有效的去噪技术——非局部均值滤波&#xff08;NLM&#xff09;的改进版本&#xff0c;即NAMF&am…