设计学习笔记10:使用状态模式和策略模式解决实际问题的例子

embedded/2024/10/24 2:25:42/

使用状态模式和策略模式解决实际问题的例子

状态模式示例:自动售货机

假设有一个自动售货机,其状态可以是“空闲”、“选择商品”、“等待支付”和“支付完成”。状态模式将允许售货机根据当前状态来改变其行为。

#include <iostream>
#include <memory>// 定义售货机的状态接口
class State {
public:virtual void insertMoney() = 0;virtual void selectProduct() = 0;virtual void dispenseProduct() = 0;virtual ~State() {}
};// 定义具体的状态
class NoProductSelectedState : public State {
public:void insertMoney() override {std::cout << "Cannot insert money, please select a product first." << std::endl;}void selectProduct() override {std::cout << "Product selected. Please insert money." << std::endl;}void dispenseProduct() override {std::cout << "No product selected." << std::endl;}
};class ProductSelectedState : public State {
public:void insertMoney() override {std::cout << "Money inserted. Please take your product." << std::endl;}void selectProduct() override {std::cout << "A product is already selected." << std::endl;}void dispenseProduct() override {std::cout << "Product dispensed. Enjoy!" << std::endl;}
};// 售货机上下文
class VendingMachine {std::unique_ptr<State> state;
public:VendingMachine() : state(std::make_unique<NoProductSelectedState>()) {}void setState(std::unique_ptr<State> newState) {state = std::move(newState);}void insertMoney() {state->insertMoney();}void selectProduct() {state->selectProduct();setState(std::make_unique<ProductSelectedState>());}void dispenseProduct() {state->dispenseProduct();}
};int main() {VendingMachine vm;vm.selectProduct(); // 选择商品vm.insertMoney();  // 投入货币vm.dispenseProduct(); // 领取商品return 0;
}

策略模式示例:排序算法

假设我们需要根据不同的条件对一组数据进行排序,比如按升序或降序排序。策略模式允许我们在运行时选择排序算法。

#include <iostream>
#include <vector>
#include <algorithm>// 定义排序策略接口
class SortStrategy {
public:virtual void sort(std::vector<int>& data) = 0;virtual ~SortStrategy() {}
};// 定义具体的排序策略
class AscendingSortStrategy : public SortStrategy {
public:void sort(std::vector<int>& data) override {std::sort(data.begin(), data.end());}
};class DescendingSortStrategy : public SortStrategy {
public:void sort(std::vector<int>& data) override {std::sort(data.begin(), data.end(), std::greater<int>());}
};// 排序上下文
class SortContext {SortStrategy* strategy;
public:SortContext(SortStrategy* strategy) : strategy(strategy) {}void setStrategy(SortStrategy* newStrategy) {strategy = newStrategy;}void executeSort(std::vector<int>& data) {strategy->sort(data);}
};int main() {std::vector<int> data = {5, 3, 8, 1, 4};SortContext context(new AscendingSortStrategy());context.executeSort(data); // 升序排序for (int num : data) {std::cout << num << " ";}std::cout << std::endl;context.setStrategy(new DescendingSortStrategy());context.executeSort(data); // 降序排序for (int num : data) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在这两个例子中,状态模式允许自动售货机根据当前状态改变其行为,而策略模式允许排序上下文根据需要改变排序算法。这些例子展示了设计模式如何在实际编程中提供灵活性和可维护性。


分享一个有趣的 学习链接


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

相关文章

【C++】类和对象——Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C &#x1f680;本系列文章为个人学习笔记…

modbus控制传感器

文章目录 modbus报文分析实例移植libmodbus问题 添加freertos初始化发送和接收发送和接收的回调函数flush 主从设备代码分析-主控如何读写从机1、串口传输&#xff0c;设置哪个串口、波特率、校验码、数据个数、体制位2、connect连接只是初始化3、主设备读写从设备14、硬件操作…

程序员找工作之操作系统面试题总结分析

程序员在找工作面试时&#xff0c;操作系统方面可能会被问到的问题涵盖了多个核心知识点和概念。以下是对这些面试问题的总结和分析&#xff1a; 1. 核心硬件与体系结构 微机的核心部件&#xff1a;询问微机硬件系统中最核心的部件是什么&#xff08;CPU&#xff09;。处理机…

CSP-J 复赛 模拟题 解析版

根据解析写代码1&#xff1a; #include <bits/stdc.h> using namespace std; long long a[101010]; long long b[101010]; int main(){bool flag0;long long t;cin>>t;while(t--){long long n,k;cin>>n>>k;for(int i1;i<n;i){cin>>a[i]>…

知识图谱和 LLM:多跳问答

检索增强生成&#xff08;RAG&#xff09;应用程序通过将外部来源的数据集成到 LLM 中&#xff0c;擅长回答简单的问题。但他们很难回答涉及将相关信息之间的点连接起来的多部分问题。这是因为 RAG 应用程序需要一个数据库&#xff0c;该数据库旨在存储数据&#xff0c;以便轻松…

深入剖析Apache Flink的状态后端

Apache Flink的状态后端是其状态管理的核心组件&#xff0c;负责存储和管理Flink程序的状态信息。状态后端的选择直接影响到Flink程序的容错能力、性能以及与外部系统的集成能力。本文将详细介绍Flink中的不同状态后端&#xff0c;包括它们的工作原理、特点、适用场景以及如何配…

明日周刊-第19期

演唱会现场的感受确实跟耳机里的感觉非常不一样&#xff0c;听见音响和人声真真切切出现在你身边&#xff0c;那种震撼可以让你暂时忘却生活的烦恼。感谢8月3日的蔡健雅演唱会&#xff0c;凑巧的是这一场是今年巡演的最后一场。 文章目录 资源分享言论歌曲推荐 资源分享 nginx…