用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
大数据
›
数据仓库与分析
›
23种计划模式 - 下令模式
23种计划模式 - 下令模式
十念
论坛元老
|
2025-2-23 03:23:13
|
来自手机
|
显示全部楼层
|
阅读模式
楼主
主题
1614
|
帖子
1614
|
积分
4842
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
模式定义
下令模式(Command Pattern)是一种行为型计划模式,它将哀求封装为独立对象,使哀求的发送者与接收者解耦。通过将操纵抽象为下令对象,支持下令的存储、通报、撤销和重做,加强系统的灵活性和可扩展性。
模式布局
抽象下令类(Command)
定义执行下令的统一接口(如execute()方法),声明撤销/重做等扩展功能。
详细下令类(ConcreteCommand)
实现抽象下令接口,关联接收者对象并调用其详细方法(如启动、停息数控机床)。
接收者(Receiver)
现实执行操纵的对象(如数控机床),包含详细的业务逻辑。
调用者(Invoker)
持有下令对象并触发其执行(如数控系统控制面板)。
客户端(Client)
创建下令对象并配置其接收者。
实用场景
操纵队列化:如数控系统需要支持批量执行加工指令。
撤销/重做功能:支持机床操纵的历史记录回滚。
分布式通讯:将长途控制指令封装为可传输对象。
C++示例(数控系统场景)
场景说明:
数控机床通过控制面板发送下令(启动、停息、急停),下令被封装为对象,支持操纵记录和撤销。
#include
#include
#include
// 接收者:数控机床
class CNC_Machine {
public:
void start() {
std::cout << "数控机床启动,开始加工..." << std::endl;
}
void pause() {
std::cout << "数控机床暂停..." << std::endl;
}
void emergencyStop() {
std::cout << "紧急停止!机床复位中..." << std::endl;
}
};
// 抽象命令类
class Command {
public:
virtual ~Command() = default;
virtual void execute() = 0;
virtual void undo() = 0; // 支持撤销操作[4][7]
};
// 具体命令:启动命令
class StartCommand : public Command {
private:
CNC_Machine& receiver_;
public:
explicit StartCommand(CNC_Machine& machine) : receiver_(machine) {}
void execute() override {
receiver_.start();
}
void undo() override {
std::cout << "撤销启动:停止加工" << std::endl;
}
};
// 具体命令:急停命令
class EmergencyStopCommand : public Command {
private:
CNC_Machine& receiver_;
public:
explicit EmergencyStopCommand(CNC_Machine& machine) : receiver_(machine) {}
void execute() override {
receiver_.emergencyStop();
}
void undo() override {
std::cout << "撤销急停:恢复运行状态" << std::endl;
}
};
// 调用者:控制面板
class ControlPanel {
private:
std::stack> history_;
public:
void executeCommand(std::unique_ptr cmd) {
cmd->execute();
history_.push(std::move(cmd)); // 记录操作历史[4][7]
}
void undoLastCommand() {
if (!history_.empty()) {
history_.top()->undo();
history_.pop();
}
}
};
// 客户端使用
int main() {
CNC_Machine machine;
ControlPanel panel;
// 发送启动命令
panel.executeCommand(std::make_unique(machine));
// 发送急停命令
panel.executeCommand(std::make_unique(machine));
// 撤销上一次操作
panel.undoLastCommand(); // 输出:撤销急停:恢复运行状态
return 0;
}
复制代码
代码解析
接收者:CNC_Machine类实现机床的现实操纵(如启动、急停)。
详细下令:StartCommand和EmergencyStopCommand封装操纵,关联接收者对象。
调用者:ControlPanel管理下令执行历史,支持撤销操纵。
解耦上风:新增下令(如停息下令)只需扩展Command子类,无需修改调用者代码。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
十念
论坛元老
这个人很懒什么都没写!
楼主热帖
Velero系列文章(四):使用Velero进行 ...
Kali Linux利用MSF入侵安卓手机(小白版 ...
C/C++函数的调用约定详解
SonarQube安全扫描
三天吃透Kafka面试八股文
Android Studio 实现登录注册-源代码 ...
微光互联 TX800-U 扫码器无法输出中文 ...
xmrig挖矿样本分析 miner
Python嘎嘎涨知识的7个小游戏,玩过的 ...
ENVI无缝镶嵌、拼接栅格数据的方法 ...
标签云
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表