C++设计模式之解释器模式
概述:
未来机器智能化已然成为趋势,现在手机都能听懂英语和普通话,那我大中华几万种方言的被智能化也许也是趋势,我们的方言虽然和普通话相似,但是还是不一样的。这可能需要一个新的语法分析器来帮助我们。
我们的解释器模式就是描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。
但是解释一门自然语言是复杂的过程,我们以加减运算为例子来详细解释解释器模式。
UML类图:
// Interpreter.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <map> #include <string> #include<iostream> using namespace std; class Context { private: map<string,int> valueMap; public: void addValue(string key,int value) { valueMap.insert(std::pair<string,int>(key,value)); } int getValue(string key) { return valueMap[key]; } }; class AbstractExpression { public : virtual int interpreter(Context context) = 0; }; class AddNonterminalExpression:public AbstractExpression { private : AbstractExpression *left; AbstractExpression *right; public: AddNonterminalExpression(AbstractExpression *left, AbstractExpression *right) { this->left = left; this->right = right; } int interpreter(Context context) { return this->left->interpreter(context) + this->right->interpreter(context); } }; class SubtractNonterminalExpression:public AbstractExpression { private : AbstractExpression *left; AbstractExpression *right; public: SubtractNonterminalExpression(AbstractExpression *left, AbstractExpression *right) { this->left = left; this->right = right; } int interpreter(Context context) { return this->left->interpreter(context) - this->right->interpreter(context); } }; class TerminalExpression :public AbstractExpression { private: int i; public: TerminalExpression(int i) { this->i = i; } int interpreter(Context context) { return this->i; } }; int _tmain(int argc, _TCHAR* argv[]) { //a-b+c cout<<"解释器模式:a-b+c"<<endl; Context context; context.addValue("a",7); context.addValue("b",8); context.addValue("c",2); SubtractNonterminalExpression *subtractValue = new SubtractNonterminalExpression(new TerminalExpression(context.getValue("a")),new TerminalExpression(context.getValue("b"))); AddNonterminalExpression *addValue = new AddNonterminalExpression(subtractValue,new TerminalExpression(context.getValue("c"))); cout<< addValue->interpreter(context)<<endl; return 0; }