[设计模式]行为模式-解释器(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模式等,后面再结合实际项目,分享给大家。终于告一段落了。