网站开发运维,天津做网站网页的公司,深圳做步步高的公司网站,网站建设 信科网络本文章属于专栏- 概述 - 《设计模式#xff08;极简c版#xff09;》-CSDN博客 模式说明
方案#xff1a; 对每个data建立一个单点解释器对象X#xff0c;dataA和dataB之间的关系#xff0c;建立一个关系解释器对象Y#xff0c;这里的Y处理的是X1和X2。这样#xff0c;… 本文章属于专栏- 概述 - 《设计模式极简c版》-CSDN博客 模式说明
方案 对每个data建立一个单点解释器对象XdataA和dataB之间的关系建立一个关系解释器对象Y这里的Y处理的是X1和X2。这样复用了解释单文本的逻辑和多文本间关系的逻辑。优点 灵活性易于改变和扩展文法增加新的解释器。易于实现将文法规则表示为类的层次结构每个规则由一个解释器表示易于理解和实现。缺点 复杂度当文法规则复杂时可能需要大量的解释器类来表示。
本质思想解释器模式通过将语言的文法表示为类的层次结构然后建立解释器来解释这些类从而实现对语言的解释和执行。
实践建议除了正则表达式文本相关的解析等特别灵活、规则链复杂的场景。不建议使用也就是95%以上的业务用不到。 代码示例
#include iostream
#include string
#include memory// 抽象表达式类
class Expression {
public:virtual ~Expression() {}virtual bool interpret(const std::string context) const 0;
};// 终端表达式类
class TerminalExpression : public Expression {
private:std::string data;public:TerminalExpression(const std::string data) : data(data) {}bool interpret(const std::string context) const override {return context.find(data) ! std::string::npos;}
};// 非终端表达式类
class OrExpression : public Expression {
private:std::shared_ptrExpression expr1;std::shared_ptrExpression expr2;public:OrExpression(std::shared_ptrExpression expr1, std::shared_ptrExpression expr2): expr1(expr1), expr2(expr2) {}bool interpret(const std::string context) const override {return expr1-interpret(context) || expr2-interpret(context);}
};// 使用示例
int main() {std::shared_ptrExpression robert std::make_sharedTerminalExpression(Robert);std::shared_ptrExpression john std::make_sharedTerminalExpression(John);std::shared_ptrExpression orExpression std::make_sharedOrExpression(robert, john);std::cout Is Robert or John present? orExpression-interpret(John) std::endl;// 输出: Is Robert or John present? 1std::cout Is Robert or John present? orExpression-interpret(Alice) std::endl;// 输出: Is Robert or John present? 0return 0;
}