c++ - 在回调中调用解析器的设计模式
问题描述
我有一个应用程序在应用程序上执行某个操作时调用回调函数。
在这个回调函数中,我想调用一个解析器(例如一个命令行解析器)。
只有当用户在命令行上使用命令“退出”时,此解析器才会在 while 循环中运行并退出并返回回调。
在 while 循环内,用户始终可以访问命令行。根据命令行上的用户输入,解析器采取独特的行动。例如,它将设置一个变量并像这样进入数据库:
command-line>a 100
command-line>
这里a
DB 中的参数将设置为 100。
我想使用面向对象的设计对解析器进行建模。在这种情况下我可以使用哪种设计模式?
解决方案
首先,大多数设计模式都因引入一流功能而过时。你需要的是一个动作名称的调度表,它基本上是命令模式。
假设以下定义:
using Tokens = std::vector<std::string>;
using Action = std::function<void(const Tokens&)>;
Tokens read_and_tokenize_line();
void larger_command(const Tokens&);
std::map<std::string, Action> dispatch_table = {
{"a", [&](const Tokens& tokens){ my_database->set("a", tokens[1]); }},
{"larger_command", &larger_command},
};
您可以按如下方式编写核心循环:
while (true) {
auto tokens = read_and_tokenize_line();
if (tokens[0] == "quit")
break;
if (auto it = dispatch_table.find(tokens[0]); it != dispatch_table.end()) {
it->second(tokens);
} else {
std::cerr << "command " << tokens[0] << " not known" << std::endl;
}
}
推荐阅读
- java - Spring Kafka 消费者无法连接到代理
- python - 船不会发射子弹蟒蛇速成课程第2版
- android - 如果在android中被拒绝,如何再次请求许可
- reactjs - 使用 react/firebase api 创建书店列表
- apache - 什么是相当于 HTTPS 服务器的 Google Cloud 服务?
- javascript - 如何在Javascript中从数组中输出未配对元素的值?
- java - 在弹簧实体中使用枚举
- buildpack - Pack 的 CLI buildpack package 命令返回 ERROR 未知配置元素
- python - 如何将 .mat 文件转换为 Berkeley Segmentation Dataset 500 中的 .tif 图像?
- sql - JPA 需要很长时间才能做出回应