首页 > 解决方案 > 在回调中调用解析器的设计模式

问题描述

我有一个应用程序在应用程序上执行某个操作时调用回调函数。

在这个回调函数中,我想调用一个解析器(例如一个命令行解析器)。

只有当用户在命令行上使用命令“退出”时,此解析器才会在 while 循环中运行并退出并返回回调。

在 while 循环内,用户始终可以访问命令行。根据命令行上的用户输入,解析器采取独特的行动。例如,它将设置一个变量并像这样进入数据库:

command-line>a 100
command-line>

这里aDB 中的参数将设置为 100。

我想使用面向对象的设计对解析器进行建模。在这种情况下我可以使用哪种设计模式?

标签: c++oopdesign-patterns

解决方案


首先,大多数设计模式都因引入一流功能而过时。你需要的是一个动作名称的调度表,它基本上是命令模式

假设以下定义:

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;
    }
}

推荐阅读