2026/5/14 1:57:01
网站建设
项目流程
龙口建设网站,网站平台代理,网站建设公司 经营资质,html模板之家免费下载设计模式[15]——解释器模式#xff08;Interpreter#xff09;一分钟彻底说透#xff08;C版软件领域真实例子#xff09;
一句话定义
给定一个语言#xff08;语法规则#xff09;#xff0c;定义它的文法表示#xff0c;并定义一个解释器来解释和执行该语言中的句子…设计模式[15]——解释器模式Interpreter一分钟彻底说透C版·软件领域真实例子一句话定义给定一个语言语法规则定义它的文法表示并定义一个解释器来解释和执行该语言中的句子。最狠的比喻软件人专属SQL查询解析器用户输入SELECT name FROM users WHERE age 30解释器把字符串解析成抽象语法树AST然后遍历树执行筛选、投影、过滤客户端只管写SQL完全不知道底层怎么解析执行。GoF原版解释器很冷门因为它通常只用于自定义小型语言/DSL领域特定语言大项目里往往用现成解析器如ANTLR、Boost.Spirit但理解它能让你看懂所有表达式引擎的原理。为什么需要它坏味道瞬间爆炸不用解释器你会这样写if(inputA and B){/* 手动解析 */}elseif(inputA or (B and C)){/* 嵌套if爆炸 */}// 新增一种语法所有代码全改寄和之前模式彻底分清10秒表项目命令Command责任链Chain解释器Interpreter核心意图操作封装成对象请求沿链找处理者定义语法规则并解释执行输入单个命令对象单个请求一段“句子”字符串/表达式处理方式执行/撤销传递/终止递归遍历语法树执行典型场景撤销重做、宏命令中间件、审批规则引擎、SQL、表达式计算器口号“命令即对象”“传下去直到有人接”“语法树里走一遭”真实软件例子简单布尔表达式解释器规则引擎常见#includeiostream#includememory#includestring#includemapusingnamespacestd;// 上下文携带变量值structContext{mapstring,boolvariables;};// 1. 抽象表达式所有节点共用接口classExpression{public:virtual~Expression()default;virtualboolinterpret(constContextctx)const0;};// 2. 终结符表达式变量classVariable:publicExpression{string name;public:explicitVariable(string n):name(move(n)){}boolinterpret(constContextctx)constoverride{autoitctx.variables.find(name);returnit!ctx.variables.end()it-second;}};// 3. 非终结符表达式运算符classAndExpression:publicExpression{unique_ptrExpressionleft,right;public:AndExpression(unique_ptrExpressionl,unique_ptrExpressionr):left(move(l)),right(move(r)){}boolinterpret(constContextctx)constoverride{returnleft-interpret(ctx)right-interpret(ctx);}};classOrExpression:publicExpression{unique_ptrExpressionleft,right;public:OrExpression(unique_ptrExpressionl,unique_ptrExpressionr):left(move(l)),right(move(r)){}boolinterpret(constContextctx)constoverride{returnleft-interpret(ctx)||right-interpret(ctx);}};classNotExpression:publicExpression{unique_ptrExpressionexpr;public:explicitNotExpression(unique_ptrExpressione):expr(move(e)){}boolinterpret(constContextctx)constoverride{return!expr-interpret(ctx);}};客户端构建并解释表达式树intmain(){// 构建表达式(isAdmin and isActive) or (isGuest and not isBanned)autoisAdminmake_uniqueVariable(isAdmin);autoisActivemake_uniqueVariable(isActive);autoisGuestmake_uniqueVariable(isGuest);autoisBannedmake_uniqueVariable(isBanned);autoadminAccessmake_uniqueAndExpression(move(isAdmin),move(isActive));autoguestAccessmake_uniqueAndExpression(move(isGuest),make_uniqueNotExpression(move(isBanned)));autofinalExprmake_uniqueOrExpression(move(adminAccess),move(guestAccess));// 测试不同上下文Context ctx1{{isAdmin,true},{isActive,true}};// 管理员cout管理员权限: finalExpr-interpret(ctx1)endl;// trueContext ctx2{{isGuest,true},{isBanned,false}};// 正常游客cout正常游客权限: finalExpr-interpret(ctx2)endl;// trueContext ctx3{{isGuest,true},{isBanned,true}};// 被禁游客cout被禁游客权限: finalExpr-interpret(ctx3)endl;// false}输出管理员权限: 1 正常游客权限: 1 被禁游客权限: 0C 真实项目里无处不在虽然不直接叫Interpreter规则引擎Drools/Jess的布尔规则 → 解释器模式表达式计算Cron表达式解析、数学表达式求值muParser查询语言小型SQL子集、JSONPath、XPath脚本引擎Lua/C绑定、配置文件的条件判断Boost.Spirit强大解析器生成器本质是解释器模式的高级实现经典坑 正确姿势解释器模式适合简单语法复杂语言用解析器生成器ANTLR、yacc每种语法规则对应一个类 → 类爆炸风险用组合而非继承可缓解性能要求高时解释一次后缓存AST终极口诀规则引擎开发者专属“语法规则变树状解释器里走一遭布尔SQL随便写动态执行真牛逼”刻在DNA里的一句话当你需要实现一个自定义的简单语言/表达式/规则布尔逻辑、查询、配置条件且希望灵活解释执行时立刻上解释器模式——把语法转成对象树递归解释想怎么玩都行现在解释器模式GoF里最冷门但最有逼格的一个彻底说透了