设计模式15 - 解释器模式

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

使用场景

  • 重复发生的问题可以使用解释器模式。
  • .一个简单语法需要解释的场景。

优缺点

  • 优点:
    1、可扩展性比较好,灵活。
    2、增加了新的解释表达式的方式。
    3、易于实现简单文法。

  • 缺点:
    1、可利用场景比较少。
    2、对于复杂的文法比较难维护。
    3、解释器模式会引起类膨胀。
    4、解释器模式采用递归调用方法。

注意事项

尽量不要再重要的模块中使用解释器模式,否则维护会是一个很大的问题

UML结构图

在这里插入图片描述

代码实现

interface.h
创建抽象类 - 说明;创建实体类 - 最终说明、满足一个条件即可的说明、需要同时满足两个条件的说明

#include <string>
#include <iostream>
using namespace std;

class Expression    //基类-说明
{
public:
    Expression() {}
    virtual ~Expression() {}

    virtual bool interpret(string context) = 0;
};

class TerminalExpression: public Expression //子类-最终说明
{
public:
    TerminalExpression(string data) : data(data)
    {
        cout << "init TerminalExpression" << endl;
    }

    bool interpret(string context)
    {
        if(context.find(data) != string::npos)
        {
            return true;
        }
        return false;
    }

private:
    string data;
};

class OrExpression: public Expression   //子类-满足一个条件即可的说明
{
public:
    OrExpression(Expression *exp1, Expression *exp2) : exp1(exp1), exp2(exp2)
    {
        cout << "init OrExpression" << endl;
    }

    bool interpret(string context)
    {
        return exp1->interpret(context) || exp2->interpret(context);
    }

private:
    Expression *exp1 = nullptr;
    Expression *exp2 = nullptr;
};

class AndExpression: public Expression  //子类-需要同时满足两个条件的说明
{
public:
    AndExpression(Expression *exp1, Expression *exp2) : exp1(exp1), exp2(exp2)
    {
        cout << "init AndExpression" << endl;
    }

    bool interpret(string context)
    {
        return exp1->interpret(context) && exp2->interpret(context);
    }

private:
    Expression *exp1 = nullptr;
    Expression *exp2 = nullptr;
};

main.cpp
实例应用 - 使用 Expression 类来创建规则,并解析它们

#include "interface.h"

int main()
{
    //规则:Robert 和 John 是男性
    Expression *robert = new TerminalExpression("Robert");
    Expression *john = new TerminalExpression("John");
    Expression *isMale = new OrExpression(robert, john);

    //规则:Julie 是一个已婚的女性
    Expression *julie = new TerminalExpression("Julie");
    Expression *married = new TerminalExpression("Married");
    Expression *isMarriedWoman = new AndExpression(julie, married);

    string ret1 = isMale->interpret("John") ? "true" : "false";
    string ret2 = isMarriedWoman->interpret("Married Julie") ? "true" : "false";

    cout << endl;
    cout << "John is male? " + ret1 << endl;
    cout << "Julie is a married women? " + ret2 << endl;

    return 0;
}

运行结果:
init TerminalExpression
init TerminalExpression
init OrExpression
init TerminalExpression
init TerminalExpression
init AndExpression

John is male? true
Julie is a married women? true
发布了61 篇原创文章 · 获赞 218 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34139994/article/details/95641002