苏州书生商友专业做网站,wordpress爆破,网站内做动图,wordpress 3d云标签Linux C 058-设计模式之解释器模式
本节关键字#xff1a;Linux、C、设计模式、解释器模式 相关库函数#xff1a;
概念
解释器模式#xff08;Interpreter Pattern#xff09;提供了评估语言的语法或表达式的方式#xff0c;它属于行为型模式。
解释器模式用于构建一…Linux C 058-设计模式之解释器模式
本节关键字Linux、C、设计模式、解释器模式 相关库函数
概念
解释器模式Interpreter Pattern提供了评估语言的语法或表达式的方式它属于行为型模式。
解释器模式用于构建一个能够解释特定语言或文法的句子的解释器。解释器模式给定一个语言定义它的文法的一种表示并定义一个解释器这个解释器使用该表示来解释语言中的句子。
这种模式被用在 SQL 解析、符号处理引擎等。
优缺点
优点
可扩展性好容易添加新的解释表达式的方式。 灵活性可以根据需要轻松扩展或修改文法。 易于实现简单文法对于简单的语言实现起来相对容易。
缺点
使用场景有限只适用于适合使用解释的简单文法。 维护困难对于复杂的文法维护和扩展变得困难。 类膨胀可能会产生很多类每个文法规则对应一个类。 递归调用解释器模式通常使用递归调用这可能难以理解和跟踪。
使用场景
当某一特定类型的问题频繁出现并且可以通过一种简单的语言来表达这些问题的实例时。 在需要解释执行语言中的句子时考虑使用解释器模式。 确保文法简单以避免系统变得过于复杂。
角色说明
解释器模式包含以下几个主要角色
抽象表达式Abstract Expression定义了解释器的抽象接口声明了解释操作的方法通常是一个抽象类或接口。
终结符表达式Terminal Expression实现了抽象表达式接口的终结符表达式类用于表示语言中的终结符如变量、常量等并实现了对应的解释操作。
非终结符表达式Non-terminal Expression实现了抽象表达式接口的非终结符表达式类用于表示语言中的非终结符如句子、表达式等并实现了对应的解释操作。
上下文Context包含解释器之外的一些全局信息在解释过程中提供给解释器使用通常用于存储变量的值、保存解释器的状态等。
客户端Client创建并配置具体的解释器对象并将需要解释的表达式传递给解释器进行解释。
示例代码
#include iostream
#include string
using namespace std;class Expression
{
public:Expression() {}bool interpret(string context);
};
class TerminalExpression : public Expression
{
public:TerminalExpression() {}TerminalExpression(string data) {m_Data data;}bool interpret(string context) {if (context.find(m_Data) ! -1)return true;return false;}
private:string m_Data;
};
class OrExpression : public Expression
{
public:OrExpression() {}OrExpression(Expression *expr1, Expression *expr2) {m_Expr1 expr1;m_Expr2 expr2;}bool interpret(string context) {return m_Expr1-interpret(context) || m_Expr2-interpret(context);}
private:Expression *m_Expr1;Expression *m_Expr2;
};
class AndExpression : public Expression
{
public:AndExpression() {}AndExpression(Expression *expr1, Expression *expr2) {m_Expr1 expr1;m_Expr2 expr2;}bool interpret(string context) {return m_Expr1-interpret(context) m_Expr2-interpret(context);}
private:Expression *m_Expr1;Expression *m_Expr2;
};
class InterpreterPatternDemo
{
public:InterpreterPatternDemo() {}//规则Robert 和 John 是男性static Expression *getMaleExpression() {Expression *rober new TerminalExpression(Robert);Expression *john new TerminalExpression(John);return (Expression *)(new OrExpression(rober, john));}//规则Julie 是一个已婚的女性static Expression *getMarriedWomanExpression() {Expression *julie new TerminalExpression(Julie);Expression *married new TerminalExpression(Married);return (Expression *)(new AndExpression(julie, married));}
};
//
int main(int argc, char *argv[])
{Expression *isMale InterpreterPatternDemo::getMaleExpression();Expression *isMarriedWoman InterpreterPatternDemo::getMarriedWomanExpression();cout John is male? isMale-interpret(John);cout Julie is a married women? isMarriedWoman-interpret(Married Julie);delete isMale;delete isMarriedWoman;return 0;
}
/*
John is male? true
Julie is a married women? true
*/