状态模式(C++)

ops/2024/10/19 1:13:20/

定义:状态模式(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/ops/126599.html

相关文章

爬虫逆向-js进阶(续写,搭建网站)

1.搭建简单网站1 from flask import Flask,render_template import requests import json app Flask(name)# **location**的温度是**temp**度&#xff0c;天气状况&#xff1a;**desc**app.route(/) # 绑定处理函数 def index_url():location 101010100data get_weather(lo…

Chromium html<img>对应c++接口定义

<img src"tulip.jpg" alt"上海鲜花港 - 郁金香" /> 1、html_tag_names.json5中接口定义&#xff1a; &#xff08;third_party\blink\renderer\core\html\html_tag_names.json5&#xff09; {name: "img",constructorNeedsCreateElementF…

MySQL—CRUD—进阶— (一) |ू・ω・` )

文本目录&#xff1a; ❄️一、数据库约束&#xff1a; ☑1、约束类型&#xff1a; 1&#xff09;、NULL 约束&#xff1a; 2&#xff09;、唯一约束&#xff1a; 3&#xff09;、默认约束&#xff1a; 4&#xff09;、主键约束&#xff1a; 5&#xff09;、外键约束&#xff…

linux命令之less用法

less 分屏上下翻页浏览文件内容 补充说明 less命令 的作用与more十分相似&#xff0c;都可以用来浏览文字档案的内容&#xff0c;不同的是less命令允许用户向前或向后浏览文件&#xff0c;而more命令只能向前浏览。用less命令显示文件时&#xff0c;用PageUp键向上翻页&…

巨日禄AI故事转漫画视频创作教程

【一】新建作品 添加剧本&#xff0c;从30多个画风中选择一个匹配文案的画风。如果拿不准可以参考样图。巨日禄可以一次性制作6000字&#xff0c;20分钟以上的视频。&#xff08;第一次限制了1000字&#xff0c;仅为新用户更完整体验整个流程&#xff09; 【二】选择画风 那文…

设计模式之-策略模式配合枚举

1、定义枚举接收不同的参数使用不同的handler, 2、定义个handerl接口&#xff0c;统一方法处理&#xff0c;每个handler实现该接口 public interface IMethodHandler<T, R> {/*** 处理统一入口** param req*/R process(T req); } java3、定义一个简单工厂统一处理 Comp…

【LeetCode】每日一题 2024_10_18 使二进制数组全部等于 1 的最少操作次数 I(贪心)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;使二进制数组全部等于 1 的最少操作次数 I 昨天的题目写不出来 . . . 如果我哪一天突然断更了&#xff0c;不用怀疑&#xff0c;就是那天的每日一题我写不了一点呜呜 代码与解题思路 今…

嵌入式系统---看门狗

在嵌入式系统中&#xff0c;看门狗定时器&#xff08;Watchdog Timer&#xff0c;WDT&#xff09;是一种常用的机制&#xff0c;用于检测和恢复系统在异常情况下的故障。如果系统因为某种原因&#xff08;如软件死循环&#xff09;而变得无响应&#xff0c;看门狗定时器可以自动…