本系列所有文章来自李建忠老师的设计模式笔记,系列如下:
设计模式(一)面向对象设计原则
23种设计模式(二)组件协作之模板方法
23种设计模式(三)组件协作之策略模式
23种设计模式(四)组件协作之观察者模式
23种设计模式(五)单一职责之装饰模式
23种设计模式(六)单一职责之桥模式
23种设计模式(七)对象创建之工厂方法
23种设计模式(八)对象创建之抽象工厂
23种设计模式(九)对象创建之原型模式
23种设计模式(十)对象创建之构建器
23种设计模式(十一)对象性能之单件模式
23种设计模式(十二)对象性能之享元模式
23种设计模式(十三)接口隔离之门面模式
23种设计模式(十四)接口隔离之代理模式
23种设计模式(十五)接口隔离之适配器
23种设计模式(十六)接口隔离之中介者
23种设计模式(十七)状态变化之状态模式
23种设计模式(十八)状态变化之备忘录
23种设计模式(十九)数据结构之组合模式
23种设计模式(二十)数据结构之迭代器
23种设计模式(二十一)数据结构之职责链
23种设计模式(二十二)行为变化之命令模式
23种设计模式(二十三)行为变化之访问器
23种设计模式(二十四)领域规则之解析器

文章目录

  • 动机
  • 模式定义
  • 代码
  • 要点总结

  在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。

动机

  在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。

  在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。

模式定义

  给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。

代码

#include <iostream>
#include <map>
#include <stack>using namespace std;class Expression {public:virtual int interpreter(map<char, int> var)=0;virtual ~Expression(){}
};//变量表达式
class VarExpression: public Expression {char key;public:VarExpression(const char& key){this->key = key;}int interpreter(map<char, int> var) override {return var[key];}};//符号表达式
class SymbolExpression : public Expression {// 运算符左右两个参数
protected:Expression* left;Expression* right;public:SymbolExpression( Expression* left,  Expression* right):left(left),right(right){}};//加法运算
class AddExpression : public SymbolExpression {public:AddExpression(Expression* left, Expression* right):SymbolExpression(left,right){}int interpreter(map<char, int> var) override {return left->interpreter(var) + right->interpreter(var);}};//减法运算
class SubExpression : public SymbolExpression {public:SubExpression(Expression* left, Expression* right):SymbolExpression(left,right){}int interpreter(map<char, int> var) override {return left->interpreter(var) - right->interpreter(var);}};Expression*  analyse(string expStr) {stack<Expression*> expStack;Expression* left = nullptr;Expression* right = nullptr;for(int i=0; i<expStr.size(); i++){switch(expStr[i]){case '+':// 加法运算left = expStack.top();right = new VarExpression(expStr[++i]);expStack.push(new AddExpression(left, right));break;case '-':// 减法运算left = expStack.top();right = new VarExpression(expStr[++i]);expStack.push(new SubExpression(left, right));break;default:// 变量表达式expStack.push(new VarExpression(expStr[i]));}}Expression* expression = expStack.top();return expression;
}void release(Expression* expression){//释放表达式树的节点内存...
}int main(int argc, const char * argv[]) {string expStr = "a+b-c+d-e";map<char, int> var;var.insert(make_pair('a',5));var.insert(make_pair('b',2));var.insert(make_pair('c',1));var.insert(make_pair('d',6));var.insert(make_pair('e',10));Expression* expression= analyse(expStr);int result=expression->interpreter(var);cout<<result<<endl;release(expression);return 0;
}

要点总结

  Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足”业务规则频繁变化,且类似的结构不断重复出现,并且容易抽象为语法规则的问题“才适合使用Interpreter模式。

  使用Interpreter模式来表示文法规则,从而可以使用面向对象技巧来方便地”扩展“文法。

  Interpreter模式比较适合简单的文法表示,对于复杂的文法表示,Interpreter模式会产生比较大的类层次结构,需要求助于语法分析生成器这样的标准工具。

23种设计模式(二十四)领域规则之解析器相关推荐

  1. 23种设计模式(十四)模板方法模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  2. 23种设计模式之——责任链模式(okhttp 拦截器)

    前言 网络七层协议 在现实中的责任链模型之一就是网络连接.对与程序猿而言,七层或五层的网络连接模型是肯定知道的. 当一个网络请求发出时,需要经过应用层->传输层->网络层->连接层- ...

  3. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  4. ULM图解 “23种设计模式”,及实例的类图

    UML图解设计模式 23种设计模式分为三大类 创建型模式(5种) 工厂方法模式 抽象工厂模式 单例模式 建造者模式 原型模式 结构型模式(7种) 适配器模式 装饰模式 代理模式 外观模式 桥接模式 组 ...

  5. 23种设计模式(二十二)状态模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  6. 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)

    什么是设计模式:[每天一个java设计模式(零)] - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:[每天一个java设计模式(一)] - 工厂模式 抽象工厂模式: [每天一个java设计模 ...

  7. 云计算设计模式(二十四)——仆人键模式

    云计算设计模式(二十四)--仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接訪问特定的资源或服务,以便由应用程序代码卸载数据传输操作. 这个模式是在使用云托管的存储系统或队列的应用中特别实用,而 ...

  8. 设计模式(二)23种设计模式

    设计模式(二)23种设计模式 文章目录 设计模式(二)23种设计模式 组件协作模式 策略模式 观察者模式 单一职责模式 Decorator模式 Bridge模式 对象创建模式 Factory Meth ...

  9. 我们的23种设计模式(四)

    23种设计模式总结与分析override4 19 Memento(备忘录)模式 20 Template Method(模板方法)模式 21 Status(状态)模式 22 Interpreter(解释 ...

  10. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

最新文章

  1. Prolog学习:数独和八皇后问题
  2. swoole 异步redis
  3. CSS3无前缀脚本prefixfree.js及Animatable介绍
  4. 【数据结构与算法】之深入解析“地图分析”的求解思路与算法示例
  5. Profile文件管理
  6. object.assign
  7. Pandas图表自定义数据格式
  8. mipi的dsi全称_MIPI扫盲——DSI介绍(二)
  9. linux 7 改网卡名称,CentOS7修改网卡名称
  10. css滤镜使文字变3D效果
  11. jupyter调用py文件_解决Jupyter notebook中.py与.ipynb文件的import问题
  12. Hbuilder Webview调试+逍遥安卓模拟器
  13. VMware workstations pro16.23已经安装vmware tool,Ubuntu仍然无法复制粘贴
  14. 一、万用表使用方法图解
  15. 特征选择:嵌入法---《菜菜机器学习笔记》
  16. 日化行业DMS全渠道商城系统
  17. 移动网购掀起新一轮掘金潮 电商群启战略布局(转)
  18. 积分分汇界面将判断放到D层后,D层的写法
  19. Android 平台语音通话及回音消除、噪音消除研究
  20. 3D控件坐标转换效果

热门文章

  1. 修改DevExpress中英文提示,将英文改为中文
  2. HDOJ 1465 不容易系列之一
  3. web安全day17:天天都在说的中间人攻击到底是啥
  4. 游戏开发之使用类封装动态数组(vector)(C++基础)
  5. 通俗版 TCP/UDP三次握手 四次握手
  6. 自定义Stack接口
  7. 物联网(IoT)的11大云平台:AWS、Azure、谷歌云、Oracle、
  8. js 浅拷贝和深拷贝
  9. (Spring Cloud微服务实战-书中之坑)spring cloud zuul统一处理业务异常,并且需要响应状态为200...
  10. 双倍回文[Shoi2011][bzoj2342]