解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
使用场景
重复发生的问题可以使用解释器模式。
.一个简单语法需要解释的场景。
优缺点
优点:
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
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓