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