状态模式(C++)

embedded/2024/10/19 4:04:49/

定义:状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式将状态相关的行为封装到单独的类中,并将这些对象组合成状态模式,允许状态对象在运行时改变行为。

        代码:

class TicketMachine;
// 状态接口
class State {
public:virtual ~State() = default;virtual void handle(std::shared_ptr<TicketMachine> machine) = 0;virtual std::string getStateName() const = 0;
};// 上下文:售票机
class TicketMachine : public std::enable_shared_from_this<TicketMachine> {
public:TicketMachine() {}void insertMoney() {std::cout << "Money inserted." << std::endl;handle();}void setState(std::shared_ptr<State> newState) {state = newState;std::cout << "State changed to: " << state->getStateName() << std::endl;}std::string getCurrentState() const {return state->getStateName();}private:void handle() {state->handle(shared_from_this());}std::shared_ptr<State> state;
};// 具体状态:票已售罄
class SoldOutState : public State {
public:void handle(std::shared_ptr<TicketMachine> machine) override {std::cout << "Sorry, tickets are sold out." << std::endl;}std::string getStateName() const override {return "SoldOut";}
};// 具体状态:可以售票
class AvailableState : public State {
public:void handle(std::shared_ptr<TicketMachine> machine) override {std::cout << "Ticket is available. Selling one ticket." << std::endl;machine->setState(std::make_shared<SoldOutState>()); // 改变状态}std::string getStateName() const override {return "Available";}
};int main() {auto machine = std::make_shared<TicketMachine>();machine->setState(std::make_shared<AvailableState>());machine->insertMoney(); // Ticket is available. Selling one ticket. State changed to: SoldOutmachine->insertMoney(); // Sorry, tickets are sold out.return 0;
}


http://www.ppmy.cn/embedded/128644.html

相关文章

Nginx:proxy_pass指令

proxy_pass 指令在 Nginx 中是实现反向代理和负载均衡的重要指令。 一. 反向代理 在反向代理的场景下&#xff0c;proxy_pass 指令用于将接收到的请求转发给另一个后端服务器。后端服务器地址可以是 IP 地址加端口、域名加端口、或者一个完整的 URL。 注意事项 proxy_pass …

Python近红外光谱数据分析技术

原文链接&#xff1a;Python近红外光谱数据分析技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247618985&idx4&sncb10b44822eeb8e30eadd9e45fbdcdc4&chksmfa82504ecdf5d9584a78de0adfc518c159baf1b70b26106a621adf1aa0bfaf1c67b7203e4b7c&toke…

K8s(学习笔记)

swap分区是什么呀&#xff1f; 什么是ipvs呀&#xff1f; yaml是什么呀&#xff1f;&#xff1f;&#xff1f; p20看不下去了&#xff01;&#xff01;&#xff01;

Springboot集成Kafka

一、添加依赖 我们使用spring本身支持的spring-kafka依赖&#xff0c;但是需要注意版本问题&#xff0c;不同的springboot版本支持不同的kafka版本&#xff0c;避免因版本不同带来困扰&#xff01;参考下图&#xff1a; 或者访问官网查看版本对应关系&#xff1a;Spring for Ap…

浅谈C++之日志记录

在 C 中使用 log4net 进行日志记录&#xff0c;您需要遵循以下步骤&#xff1a; 安装 log4net&#xff1a; 首先&#xff0c;您需要在您的 .NET 项目中包含 log4net 库。通常&#xff0c;这可以通过 NuGet 包管理器来完成。 配置 log4net&#xff1a; 您需要创建一个配置文件…

WebServer构建响应 发送响应

1.构建响应 构建响应流程如下 确认方法根据不同方法&#xff0c;以不同方法提参确认访问资源如果用户的URL没有指明要访问的某种资源(路径)&#xff0c;虽然浏览器默认会添加/&#xff0c;但是依旧没有告知服务器&#xff0c;要访问什么资源 此时&#xff0c;默认返回对应服务…

【Qt】继承自QItemDelegate的代理类是如何工作的?

在 Qt 中&#xff0c;继承自QItemDelegate的代理类主要使用createEditor 和 setEditorData 方法&#xff1a; 创建编辑器&#xff1a;当用户开始编辑一个项时&#xff08;例如通过双击一个单元格或者通过其他方式触发编辑&#xff09;&#xff0c;视图会调用委托的 createEdit…

Python创建多个线程分别启动http、WebSocket服务

我的计划是启动主程序后新建3个独立的线程&#xff0c;一个线程执行PLC读取&#xff0c;一个线程启动工艺测试&#xff08;含http服务&#xff09;&#xff0c;另外一个线程启动WebSocket。 新增 /lib/PlcReader.py # 执行 PLC 读取类 # 读取 PLC 配置文件 # 定时&#xff08…