[设计模式]行为模式-解释器(C++描述)

 [设计模式]行为模式-解释器(C++描述)

second60 20180608

1. 解释器模式定义

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


2. 解释器模式结构图

 

分析:

1. 抽象表达式AbstractExpression: 声明一个所有具体表达式的抽象类,有个抽象方解释方法interpret().

2. TerminalExpression终结符表达式:实现了抽象表达式所要求的接口。文法中的每一个终结符都有一个具体终结表达式与之对应。(比如公式R=R1+R2,R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

3. NonterminalExpression非终结符表达式:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。

4. Context环境类:用来存放文法中各个终结符所对应的具体值(比如R=R1+R2,给R1赋值100,给R2赋值200,这些信息需要存放到环境中。


3. 代码

class  Experssion
{
public:
virtual int interptet() = 0;
};

class NumExpression : public Expression
{
public:
NumExpression(int num):_nu(num){}
int interptet(){return num;}
private:
int _num;
};

class OperExpression: public Expression
{
public:
OperExpression(Expression* left, Expression* right)
{
_left = left;
_right = right;
}
private:
Expression* _left;
Expression* _right;
};

// 加法解释器
class AddExpression: public OperExpression
{
public:
AddExpression(Expression* left, Expression* right)
:OperExpression(left,right)
{}

int interptet()
{
return _left.interptet() + _right.interptet();
}
};

int main()
{
Expression * num1 = new NumExpression(100);
Expression * num2 = new NumExpression(100);
Expression * addExpress = new AddExpression(num1,num2);
addExpress.interptet();
//释放
}

4 使用场景

语法解析

5 优缺点

优点:

1. 扩展新规则简单,不用改变原有逻辑

缺点:

1. 当文法多时,解释器类也会变得很多,后期难维护

6 总结

解释器模式,用的不是很多,但对解释文法规则,是非常有用的。比较少用的一种植设计模式。

7 后话

23种设计模式,终于写完了,但其实有很多模式,Reactor模式,MVC模式等,后面再结合实际项目,分享给大家。终于告一段落了。


猜你喜欢

转载自blog.csdn.net/second60/article/details/80629614