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

南通seo网站价格百度站长平台删站

南通seo网站价格,百度站长平台删站,中囯联通腾迅,电子商务网站管理系统🔄 回顾 Day 8:策略模式 在 Day 8 中我们讲解了策略模式: 用于封装多个可切换的算法逻辑,让调用者在运行时选择合适的策略。它强调的是“行为选择”,是针对“算法或行为差异”而设计。通过 PaymentStrategy、路径规划…

🔄 回顾 Day 8:策略模式

在 Day 8 中我们讲解了策略模式:

  • 用于封装多个可切换的算法逻辑,让调用者在运行时选择合适的策略。
  • 它强调的是“行为选择”,是针对“算法或行为差异”而设计。
  • 通过 PaymentStrategy、路径规划等实战场景,我们实现了灵活扩展与开闭分离。

而今天的命令模式,虽然也封装行为,但它的核心在于:

将“请求”与“执行”彻底解耦,支持操作排队、记录、撤销、重做等高级控制。


一、什么是命令模式?

命令模式(Command Pattern)是行为型设计模式的一种,它将“请求封装为对象”,从而让你可以:

  • 将请求排队
  • 将请求记录日志
  • 支持命令撤销、重做
  • 实现请求者与执行者的解耦

二、适用场景

场景描述
撤销/重做操作图形编辑器、文字编辑器需要保存执行历史
请求排队打印任务、网络任务、远程执行命令
按钮映射将按钮点击操作映射为命令对象
宏命令/脚本系统一组命令批量执行

三、命令模式结构(UML)

+----------------+       +-----------------+       +---------------+
|   Client       |-----> |   Invoker       |-----> |   Command     |
+----------------+       +-----------------+       +---------------+/\/+-----------------------+| ConcreteCommand       |+-----------------------+| +execute()            |+-----------------------+|v+--------------------+| Receiver (执行者)  |+--------------------+| +action()          |+--------------------+

✅ 角色解析:

角色职责
Command抽象命令接口,定义执行方法
ConcreteCommand实现命令接口,调用 Receiver 执行命令
Receiver命令的实际执行者
Invoker触发命令的角色,如按钮、菜单项
Client负责构建命令对象,并设定 Invoker 的命令

在这里插入图片描述

四、C++ 实现:遥控器控制多个家电

✅ 抽象命令类

class Command {
public:virtual void execute() = 0;virtual ~Command() = default;
};

✅ 接收者类(家电)

class Light {
public:void on() { std::cout << "灯打开了\n"; }void off() { std::cout << "灯关闭了\n"; }
};class Fan {
public:void start() { std::cout << "风扇启动了\n"; }void stop() { std::cout << "风扇关闭了\n"; }
};

✅ 具体命令类

class LightOnCommand : public Command {Light* light;
public:LightOnCommand(Light* l) : light(l) {}void execute() override { light->on(); }
};class FanStartCommand : public Command {Fan* fan;
public:FanStartCommand(Fan* f) : fan(f) {}void execute() override { fan->start(); }
};

✅ 调用者类(遥控器)

class RemoteControl {std::map<std::string, std::unique_ptr<Command>> slots;
public:void setCommand(const std::string& key, std::unique_ptr<Command> cmd) {slots[key] = std::move(cmd);}void pressButton(const std::string& key) {if (slots.count(key)) slots[key]->execute();else std::cout << "无效按钮" << std::endl;}
};

✅ 使用示例

int main() {Light light;Fan fan;RemoteControl remote;remote.setCommand("light_on", std::make_unique<LightOnCommand>(&light));remote.setCommand("fan_start", std::make_unique<FanStartCommand>(&fan));remote.pressButton("light_on");remote.pressButton("fan_start");return 0;
}

五、进阶:支持撤销与命令队列

✅ 撤销接口扩展:

class Command {
public:virtual void execute() = 0;virtual void undo() = 0;virtual ~Command() = default;
};

具体命令实现 undo:记录之前状态并逆操作。

✅ 命令队列:

std::queue<std::unique_ptr<Command>> commandQueue;
commandQueue.push(...);
while (!commandQueue.empty()) {commandQueue.front()->execute();commandQueue.pop();
}

六、命令模式与其他模式对比

模式区别焦点
策略模式封装“算法”,客户端主动调用
命令模式封装“请求”,支持请求与执行解耦
观察者模式事件驱动响应,多观察者监听

七、面试回答模板

“命令模式我们在设备控制系统中使用得较多,例如遥控器设置不同按键指令时,通过封装命令类(Command),将操作与实际执行者解耦,便于我们记录命令、支持批量执行、撤销重做等功能。同时,Invoker(遥控器)只需要触发,不关心具体如何执行,实现了请求分发中心的架构。”


八、记忆口诀

“请求包起来,请求再排队;触发和执行,隔离不耦合。”


九、明日预告:Day 10

模板方法模式(Template Method):定义算法骨架,延迟具体实现给子类,实现复用与规范统一。

http://www.dtcms.com/wzjs/800119.html

相关文章:

  • 网站建设lhempire莱芜金点子信息港租房信息
  • 怎样在在农行网站上做风险评估南京制作网页速成班
  • 三河做网站wordpress注册模板下载
  • 网站开发分几个模块洛阳航迪科技网站建设公司怎么样
  • 物流网站建设费用沈阳工程信息交易网
  • 网站图片搜索技术哪里可以做网站没有备案 合法吗
  • 潮州网站建设推广建一个单页网站
  • 百度智能建站平台石大远程网页设计与网站建设答案
  • 我做的网站怎样被百度收录品牌网站建设公司有哪些
  • 商务网站建设一万字网页设计十大排名
  • 海宁网站开发深圳团购网站建设
  • 东莞网站建设公司哪家好wordpress 手册 chm
  • 福州市网站建设推广软件的渠道有哪些
  • 网站过期了怎么办合肥网站关键词seo优化公司
  • 如何给自己网站做反链网站建设主要包括
  • 晋江市住房和城乡建设网站北京朝阳官方平台
  • 网站建设重庆黄岛区建设局网站
  • 电子商务网站规划设计包括哪些方面百度推广客户端怎样注册
  • 中山建设网站官网wordpress密文
  • 海口手机端建站模板做网站需要服务器和什么软件
  • 凡科网怎么做网站wordpress数据库thinkphp
  • 卢松松网站的百度广告怎么做的云软件网站建设
  • 昆明网站建设推广公司哪家好外贸网站建站要多少钱
  • 谷歌 网站开发深圳创业补贴政策2021申请流程
  • 广州网站开发费用农业推广学
  • 建设商城类网站多少钱周口seo
  • 外贸网站推广计划wordpress 中文图片
  • 农资网站建设北京电商购物网站开发
  • 南昌网站搭建制作公司中国建设银行官网首页登录
  • 做ptt网站推广引流的10个渠道