当前位置: 首页 > news >正文

音乐门户网站模板杭州思拓网站建设

音乐门户网站模板,杭州思拓网站建设,在线写代码的网站,hge网站做微端一、为什么用命令模式在软件设计中,命令模式(Command Pattern)提供了一种将请求封装为对象的方式,从而使请求的发送者和执行者解耦。这在以下场景非常有用:当操作需要支持撤销、排队、延迟执行或日志记录时&#xff0c…

一、为什么用命令模式

    在软件设计中,命令模式(Command Pattern)提供了一种将请求封装为对象的方式,从而使请求的发送者和执行者解耦。这在以下场景非常有用:当操作需要支持撤销、排队、延迟执行或日志记录时,命令模式能将逻辑统一管理。

    餐厅点餐系统是典型场景:服务员记录顾客订单,厨师按顺序制作,每道菜可独立撤销或取消,但正在制作的菜不能撤销。直接在服务员或厨师中处理复杂逻辑,会导致代码耦合,难以扩展。使用命令模式,将“下单”“做菜”“撤销”操作封装成独立命令对象,既清晰又易维护。

二、场景说明

    在这个场景中,餐厅的服务员负责接收顾客点餐。每道菜都是一个独立的命令对象,例如“红烧鱼”和“家乡煎豆腐”。顾客下单后,服务员将订单加入队列,但厨师是按顺序做菜的,当前只做一道菜,做完后才开始下一道。

    系统支持顾客在下单后撤销某些菜,但有严格限制:正在烹饪的菜不可撤销,只允许撤销尚未开始的菜。服务员可以继续接收新订单,撤销旧订单,厨师按照队列顺序烹饪所有菜品。这样既满足实际业务需求,也充分体现了命令模式的灵活性和可扩展性。

三、类图

四、C++代码实现

#include <iostream>
#include <memory>
#include <map>
#include <deque>
#include <algorithm>enum class OrderStatus { Pending, Cooking, Done };// 命令接口
class Command {
public:virtual ~Command() = default;virtual void execute() = 0;  virtual void undo() = 0;     
};// 厨师
class Chef {
public:void cookFish() { std::cout << "厨师:开始做红烧鱼!\n"; }void cancelFish() { std::cout << "厨师:取消红烧鱼。\n"; }void cookTofu() { std::cout << "厨师:开始做家乡煎豆腐!\n"; }void cancelTofu() { std::cout << "厨师:取消家乡煎豆腐。\n"; }
};// 具体命令
class FishCommand : public Command {
public:FishCommand(Chef* chef) : chef_(chef) {}void execute() override { chef_->cookFish(); }void undo() override { chef_->cancelFish(); }
private:Chef* chef_;
};class TofuCommand : public Command {
public:TofuCommand(Chef* chef) : chef_(chef) {}void execute() override { chef_->cookTofu(); }void undo() override { chef_->cancelTofu(); }
private:Chef* chef_;
};// 服务员
class Waiter {
public:int takeOrder(std::unique_ptr<Command> cmd) {int id = nextId_++;orders_[id] = { std::move(cmd), OrderStatus::Pending };orderQueue_.push_back(id);std::cout << "服务员:记录订单编号 " << id << "\n";cookNextIfIdle();return id;}void cancelOrder(int id) {auto it = orders_.find(id);if (it != orders_.end()) {if (it->second.status == OrderStatus::Pending) {it->second.command->undo();orderQueue_.erase(std::remove(orderQueue_.begin(), orderQueue_.end(), id),orderQueue_.end());orders_.erase(it);} else {std::cout << "订单 " << id << " 正在做或已完成,无法撤销。\n";}} else {std::cout << "没有找到编号为 " << id << " 的订单。\n";}}private:struct OrderItem {std::unique_ptr<Command> command;OrderStatus status;};void cookNextIfIdle() {if (isCooking_ || orderQueue_.empty()) return;isCooking_ = true;while (!orderQueue_.empty()) {int id = orderQueue_.front();orderQueue_.pop_front();auto it = orders_.find(id);if (it != orders_.end()) {it->second.status = OrderStatus::Cooking;it->second.command->execute();it->second.status = OrderStatus::Done;orders_.erase(it); }}isCooking_ = false;std::cout << "厨师:所有订单已完成。\n";}int nextId_ = 1;bool isCooking_ = false;std::map<int, OrderItem> orders_;std::deque<int> orderQueue_;
};// 测试
int main() {Chef chef;Waiter waiter;int o1 = waiter.takeOrder(std::make_unique<FishCommand>(&chef));int o2 = waiter.takeOrder(std::make_unique<TofuCommand>(&chef));int o3 = waiter.takeOrder(std::make_unique<FishCommand>(&chef));waiter.cancelOrder(o2); // 可以取消豆腐,只要它还没开始做int o4 = waiter.takeOrder(std::make_unique<TofuCommand>(&chef)); // 新下单豆腐return 0;
}

五、总结

    通过这个餐厅点餐示例,我们可以看到命令模式在实际开发中的几个优势:

  1. 解耦请求和执行:服务员只负责接单和管理订单,厨师专注于烹饪逻辑,二者职责清晰分明。

  2. 支持撤销与延迟操作:每道菜都是独立的命令对象,未开始的菜可以随时取消,而正在烹饪的菜则安全执行。

  3. 扩展性强:增加新菜品只需创建新的命令类,无需修改服务员或厨师核心逻辑,符合开闭原则。

  4. 维护方便:通过订单状态管理和队列处理,烹饪顺序和撤销逻辑清晰可控。

这个示例不仅清楚地展示了命令模式的用法,也贴合实际餐厅点餐流程,对于想在 C++ 项目中灵活运用设计模式的开发者,很有参考意义。

http://www.dtcms.com/a/451733.html

相关文章:

  • 网站开发 加二维扫码大理北京网站建设
  • 中国建设企业银行官网站邹城市建设局网站
  • 在车子男女做的视频网站软文范例大全500
  • 哔哩哔哩视频大全优化企业网站排名要多少钱
  • 石做视频网站需要牌照无限空间 网站
  • 设计权限系统
  • 具有口碑的柳州网站建设哪家好微商怎么加好友增加大量客源
  • 学习网站建设的心得计算机动漫制作专业
  • 上海最大的网站建设php 数据库转wordpress
  • 乐山市建设局官方网站如何搜网站
  • 网站维护的内容有哪些加工网袋的设备多少钱
  • 美妆企业网站模板如何建设一个新的网站
  • 嘉祥做网站潍坊百度网站建设
  • 万户做网站好不好金融企业网站整站源码
  • 服装网站建设课程设计公司资质等级
  • 飞行时代网站建设南昌网站建设开发团队
  • 网站设计报告模板及范文互联网推广广告
  • 做网站怎么赚流量国企央企招聘2022年
  • 给城市建设提议献策的网站燕窝网站怎么做的
  • 杭州网站设计网站wordpress插件下载方法
  • 深圳网站快速备案苏州制作网页找哪家
  • 受欢迎的昆明网站建设网站备份了怎么恢复
  • 西安商城网站搭建网络营销方法选择
  • 网站qq链接怎么做山东网站建设标准
  • seo网站描述wordpress 修改文字
  • 东八区网站建设完整app开发流程
  • 做药公司的网站前置审批wordpress 栏目排版
  • 自己在家怎么做网站服务器做模版网站需要租服务器吗
  • 免费网站建设视频教程个人网站模板代码
  • 企业邮箱电话人工服务24小时整站优化seo公司哪家好