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

C++ 设计模式《智能任务助手上线,小明用上了解释器》

👨‍🎓 模式名称:解释器模式(Express)

👦 故事背景:

小明最近上线了一个“智能任务助手”功能:
只要输入类似这样的字符串,就能让平台自动执行任务:

“送奶茶 AND 打扫卫生 OR 帮我跑腿”

但问题来了——怎么解析这种自由组合的命令语句呢?

如果用 if/else 硬编码判断,命令组合一变就要重写代码,小明快被气哭了 😭。

于是他学会了——解释器模式!

✅ 使用解释器模式的解决方案

🧱 抽象表达式类
class Expression {
public:virtual bool interpret(const std::string& context) = 0;virtual ~Expression() {}
};
🧱 终结符表达式(每种服务)
class TerminalExpression : public Expression {std::string keyword;
public:TerminalExpression(const std::string& word) : keyword(word) {}bool interpret(const std::string& context) override {return context.find(keyword) != std::string::npos;}
};
🧱 非终结符表达式(AND / OR)
class OrExpression : public Expression {Expression* expr1;Expression* expr2;
public:OrExpression(Expression* e1, Expression* e2) : expr1(e1), expr2(e2) {}bool interpret(const std::string& context) override {return expr1->interpret(context) || expr2->interpret(context);}~OrExpression() {delete expr1;delete expr2;}
};class AndExpression : public Expression {Expression* expr1;Expression* expr2;
public:AndExpression(Expression* e1, Expression* e2) : expr1(e1), expr2(e2) {}bool interpret(const std::string& context) override {return expr1->interpret(context) && expr2->interpret(context);}~AndExpression() {delete expr1;delete expr2;}
};
🌟 创建命令解释器逻辑
Expression* buildExpression() {// "送奶茶 AND 打扫卫生 OR 跑腿"Expression* milkTea = new TerminalExpression("奶茶");Expression* clean = new TerminalExpression("打扫");Expression* runErrand = new TerminalExpression("跑腿");Expression* andExpr = new AndExpression(milkTea, clean);return new OrExpression(andExpr, runErrand);
}
使用示例
int main() {Expression* expr = buildExpression();std::string input1 = "请帮我送奶茶然后打扫下宿舍";std::string input2 = "跑腿去买点东西";std::string input3 = "只是送奶茶";std::cout << "input1: " << expr->interpret(input1) << "\n";  // truestd::cout << "input2: " << expr->interpret(input2) << "\n";  // truestd::cout << "input3: " << expr->interpret(input3) << "\n";  // falsedelete expr;
}

❌ 不使用解释器模式的写法

bool parseCommand(const std::string& cmd) {if (cmd.find("奶茶") != std::string::npos &&cmd.find("打扫") != std::string::npos) {return true;}if (cmd.find("跑腿") != std::string::npos) {return true;}return false;
}

👎 缺点:

  • 每次命令组合变动都要修改逻辑
  • 无法复用、组合,命令变复杂就变得极其混乱
  • 不符合开闭原则(不能方便地添加新服务)

✅ 优势总结

优势描述
📖 自定义小型语言能将规则/命令表达为结构
🔄 灵活扩展支持组合(AND/OR)、嵌套等复杂逻辑
♻️ 复用性高表达式可以灵活重用
http://www.dtcms.com/a/594282.html

相关文章:

  • 小型企业建设网站陕西网站建设公司找哪家
  • Rust编译时计算:`const` 函数、泛型与高级类型体操
  • 从零开始理解和编写LLM中的KV缓存
  • 做离线版申报表进入哪个网站广告设计专业术语
  • 做网站维护要学些什么·咋做网站代码背景图
  • zustand解决的痛点以及zustand状态管理与C++全局变量的区别对比
  • 介绍自己做的网站室内设计奖项有哪些
  • 基于Zigbee协议的分布式漏水检测系统设计与实
  • 网站建设中怎么设置默认页小小影院 电视剧免费
  • 蓝牙钥匙 第73次 蓝牙与蜂窝网络:技术特性与互补优势
  • 公司网站模块制作国内男女直接做的视频网站
  • 嵌入式系统外接看门狗配置注意事项
  • 2025-Agent解析
  • 网站 域名解析出错中企动力苏州网页设计
  • 网站怎么做网页河南网站平台建设公司
  • 3.注册页测试用例
  • 加强文明网站内容建设做网站做推广
  • Unity 二级弹窗机制与回调实现原理
  • 面向C++程序员的JavaScript 语法实战学习1
  • 做某网站的设计与实现深圳做网站制作
  • K8S中Ingress的使用
  • 怎么建立微信网站あかねさす少女免费
  • 基于单片机的多波形信号发生器设计
  • JAVA1110 反射 泛型
  • 设计网站大全软件网络营销有哪些功能
  • 余江网站建设河南郑州百姓网
  • 济南莱芜最新消息seo平台是什么意思
  • 银河麒麟高级服务器操作系统V10SP3 2403(X86)PXE服务端部署以及测试
  • 安徽建站优化哪里有八戒八戒在线观看免费完整版
  • 远距离视频传输无线模块:打破空间限制的未来科技