C++设计模式:解释器模式
一、源代码:
#include<iostream>
#include<memory>
using namespace std;
class Expression
{
public:
virtual bool interpret(string context) = 0;
virtual ~Expression() = default;
};
class TerminalExpression:public Expression
{
public:
TerminalExpression(string data)
{
this->_data = data;
}
virtual bool interpret(string context) override
{
if(context.find(_data)!=string::npos)
{
return true;
}
else
{
return false;
}
}
private:
string _data;
};
class OrExpression:public Expression
{
public:
OrExpression(shared_ptr<Expression> expr1,shared_ptr<Expression> expr2)
{
this->_expr1 = expr1;
this->_expr2 = expr2;
}
virtual bool interpret(string context) override
{
return (_expr1->interpret(context)||_expr2->interpret(context));
}
private:
shared_ptr<Expression> _expr1;
shared_ptr<Expression> _expr2;
};
class AndExpression:public Expression
{
public:
AndExpression(shared_ptr<Expression> expr1,shared_ptr<Expression> expr2)
{
this->_expr1 = expr1;
this->_expr2 = expr2;
}
virtual bool interpret(string context) override
{
return (_expr1->interpret(context)&&_expr2->interpret(context));
}
private:
shared_ptr<Expression> _expr1;
shared_ptr<Expression> _expr2;
};
int main()
{
//规则:John是男性
shared_ptr<Expression> john = make_shared<TerminalExpression>("John");
shared_ptr<Expression> female = make_shared<TerminalExpression>("Female");
shared_ptr<Expression> orMale = make_shared<OrExpression>(john,female);
cout<<"John is a male? "<<boolalpha<<orMale->interpret("John is a male")<<endl;
//规则:Juli是一个已婚的女性
shared_ptr<Expression> julie = make_shared<TerminalExpression>("Julie");
shared_ptr<Expression> married = make_shared<TerminalExpression>("Married");
shared_ptr<Expression> isMarried = make_shared<AndExpression>(julie,married);
cout<<"Julie is a married women? "<<isMarried->interpret("Married Julie")<<endl;;
}
二、运行结果: