定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
看定义感觉就不像个程序模式,相关资料不多,靠谱的更少,csdn找到了个例子,还是错误的,我整理修改下作为参考,看代码还是很容易理解这模式是什么。
#include <iostream>
using namespace std;
class Expression
{
public:
Expression() {};
public:
virtual bool Interpret(string context) = 0;
};
class TerminalExpression :public Expression
{
public:
TerminalExpression(string context) :m_strData(context){ };
public:
bool Interpret(string context)
{
if (m_strData.find(context) == string::npos)
{
return false;
}
return true;
}
private:
string m_strData;
};
class OrExpression :public Expression
{
public:
OrExpression(Expression* pExpression1, Expression* pExpression2) :m_pExpression1(pExpression1), m_pExpression2(pExpression2) {}
public:
bool Interpret(string context)
{
return m_pExpression1->Interpret(context) || m_pExpression2->Interpret(context);
}
private:
Expression *m_pExpression1;
Expression *m_pExpression2;
};
class AndExpression :public Expression
{
public:
AndExpression(Expression* pExpression1, Expression* pExpression2) :m_pExpression1(pExpression1), m_pExpression2(pExpression2) {}
public:
bool Interpret(string context)
{
return m_pExpression1->Interpret(context) && m_pExpression2->Interpret(context);
}
private:
Expression *m_pExpression1;
Expression *m_pExpression2;
};
int main()
{
//创建规则:pig 和 dog是 animal(猪狗是动物)
Expression* pIsAnimal = new OrExpression(new TerminalExpression("pig"), new TerminalExpression("dog"));
//创建规则:o(o既在Hello中也在World中)
Expression* pIsAllIn = new AndExpression(new TerminalExpression("Hello"), new TerminalExpression("World"));
cout << "dog is animal? " << (pIsAnimal->Interpret("dog") == true ? "true" : "false") << endl;
cout << "o is in Hello and World? " << (pIsAllIn->Interpret("o") == true ? "true" : "false") << endl;
system("pause");
return 0;
}
创建了三个解释规则,包含、两个包含一个、两个都包含,就这回事