目录

领域模式_Interpreter


领域模式

在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。

典型模式

Interpreter

1 Interpreter

1.1 模式动机

在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。

在这种情况下,将特定领域的问题表达为某种语法规则下的句子, 然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。

1.2 模式定义

给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。

1.3 模式示例代码

# include <iostream>
# include <stack>
# include <string>

// 抽象表达式类:表达式
class Expression {
public:
    virtual int interpret() = 0;
};

// 终结符表达式类:数字表达式
class NumberExpression : public Expression {
public:
    NumberExpression(int number) : number(number) {}

    int interpret() {
        return number;
    }

private:
    int number;
};

// 非终结符表达式类:加法表达式
class AddExpression : public Expression {
public:
    AddExpression(Expression* left, Expression* right) : left(left), right(right) {}

    int interpret() {
        return left->interpret() + right->interpret();
    }

private:
    Expression* left;
    Expression* right;
};

// 非终结符表达式类:减法表达式
class SubtractExpression : public Expression {
public:
    SubtractExpression(Expression* left, Expression* right) : left(left), right(right) {}

    int interpret() {
        return left->interpret() - right->interpret();
    }

private:
    Expression* left;
    Expression* right;
};

// 解析器类:解析器
class Parser {
public:
    Expression* parse(const std::string& expression) {
        std::stack<Expression*> stack;
        for (int i = 0; i < expression.length(); ++i) {
            if (isdigit(expression[i])) {
                int number = expression[i] - '0';
                stack.push(new NumberExpression(number));
            } else if (expression[i] == '+') {
                Expression* right = stack.top();
                stack.pop();
                Expression* left = stack.top();
                stack.pop();
                stack.push(new AddExpression(left, right));
            } else if (expression[i] == '-') {
                Expression* right = stack.top();
                stack.pop();
                Expression* left = stack.top();
                stack.pop();
                stack.push(new SubtractExpression(left, right));
            }
        }
        return stack.top();
    }
};

int main() {
    Parser parser;

    // 解析并计算数学表达式:"5 + (7 - 3)"
    Expression* expression = parser.parse("5+(7-3)");
    int result = expression->interpret();
    std::cout << "计算结果:" << result << std::endl;

    // 释放内存(可选)
    delete expression;

    return 0;
}

2 要点总结

Interpreter 模式的应用场合是 Interpreter 模式应用中的难点,只有满足“业务规则频繁变化,且类似的结构不断重复出现,并且容易抽象为语法规则的问题“才适合使用 Interpreter 模式。

使用 Interpreter 模式来表示文法规则,从而可以使用面向对象技巧来方便地“扩展“文法。

Interpreter 模式比较适合简单的文法表示,对于复杂的文法表示, Interperter 模式会产生比较大的类层次结构,需要求助于语法分析生成器这样的标准工具。