解释器模式

  • 一、概述
    • 二、结构
      • 三、实例
      • 四、适用场景
      • 五、优缺点

一、概述

描述:当不懂英文的中国人和不懂中文的外国人交流时会存在沟通障碍。这时有种翻译器能将两种语言进行转换各个对方国家语言,然后进行交流。

定义:通常当一个语言需要解释执行,并且你可以将该语言中的句子表示成为 一个抽象的语法树时,可以使用解释器模式。

二、结构

  1. 抽象表达式(Abstract Expression):定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
  2. 终结符表达式(Terminal Expression):是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
  3. 非终结符表达式(Nonterminal Expression):也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
  4. 上下文(Context):通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

三、实例

//计算加减乘除
#include<iostream>
#include<map>
#include<stack>
using namespace std;///抽象类表达式 通过map可以获取变量的值
class Expression
{public:virtual int interpreter(map<char, int> var) = 0;
};///变量的解释器
class VarExpression :public Expression
{public:VarExpression(char key){m_key = key;}virtual int interpreter(map<char, int> var){return var[m_key];}
private:char m_key;
};///抽象运算符号解析器 每个运算符号都只和自己左右连个数字有关系
///但左右两个数字有可能也是一个解析的结果,无论何种类型都是expression类的实现类
// 抽象运算符号解析器
class SymbolExpression :public Expression
{public:SymbolExpression(Expression* leftExpression, Expression* rightExpression){m_leftExpression = leftExpression;m_rightExpression = rightExpression;}///因为sybmol 是让子类来实现 因此interpreter是一个默认的实现int interpreter(map<char, int> var){return 0;}
protected:Expression* m_leftExpression;Expression* m_rightExpression;
};
// 加法解析器
class AddExpression :public SymbolExpression
{public:AddExpression(Expression* leftExpression, Expression* rightExpression) :SymbolExpression(leftExpression, rightExpression){}virtual int interpreter(map<char, int> var){return m_leftExpression->interpreter(var) + m_rightExpression->interpreter(var);}
};// 减法解析器
class SubExpression :public SymbolExpression
{public:SubExpression(Expression* leftExpression, Expression* rightExpression) :SymbolExpression(leftExpression, rightExpression){}virtual int interpreter(map<char, int> var){return m_leftExpression->interpreter(var) - m_rightExpression->interpreter(var);}
};// 解析器封装类
class Calculator
{public:Calculator(string expStr){stack<Expression*> stack;Expression* left = nullptr;Expression* right = nullptr;for (int i = 0; i < expStr.size(); i++){switch (expStr[i]){case '+':left = stack.top();stack.pop();right = new VarExpression(expStr[++i]);stack.push(new AddExpression(left, right));break;case '-':left = stack.top();stack.pop();right = new VarExpression(expStr[++i]);stack.push(new SubExpression(left, right));break;default:stack.push(new VarExpression(expStr[i]));}}m_expression = stack.top();}int run(map<char, int> var){return m_expression->interpreter(var);}
private:Expression* m_expression;
};///解释器模式
int main()
{cout << "interpreter patterns" << endl;///利用解释器模式计算表达式a+b-cCalculator calc("a-b+c");map<char, int> var1;var1.insert(make_pair('a', 10));var1.insert(make_pair('b', 5));var1.insert(make_pair('c', 7));cout << calc.run(var1) << endl;map<char, int> var2;var2.insert(make_pair('a', 8));var2.insert(make_pair('b', 1));var2.insert(make_pair('c', 50));cout << calc.run(var2) << endl;
}

四、适用场景

  1. 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树;
  2. 一些重复出现的问题可以用一种简单的语言来进行表达;
  3. 一个语言的文法较为简单;
  4. 执行效率不是关键问题。

五、优缺点

优点:

  1. 可扩展性比较好,灵活。

  2. 增加了新的解释表达式的方式。

  3. 易于实现简单文法。
    缺点:

  4. 可利用场景比较少。

  5. 对于复杂的文法比较难维护。

  6. 解释器模式会引起类膨胀。

  7. 解释器模式采用递归调用方法。

解释器模式在实际的系统开发中使用的非常少,因为它会引起效率、性能以及维护方面的问题,并且难度较大,一般在一些大中型的框架型项目中能够找到它的身影。而现在又有很多的开源库提供了对实际需要的支持,所以,我们在实际开发中没有必要再去重复造轮子,能够理解了解释器模式就好了。

Interpreter(解释器模式)行为型相关推荐

  1. Interpreter解释器模式

    前言: 关于23种设计模式的所有示例代码请参考:https://github.com/Wuchenwcf/MyCode/tree/master/DP 本文所述代码请参考:https://github. ...

  2. 浅谈Interpreter解释器模式

    一.前言 这是我们23个设计模式中最后一个设计模式了,大家或许也没想到吧,竟然是编译原理上的编译器,这样说可能不对,因为编译器分为几个部分组成呢,比如词法分析器.语法分析器.语义分析器.中间代码优化器 ...

  3. Interpreter - 解释器模式

    定义 给定一个语言, 定于它的文法,并定义一个解释器,这个解释器使用改表示来解释语言中的句子. 类型 行为型模式 案例 像很熟知的正則表達式就是描写叙述字符串模式的一种标准语言,它为每个模式都构造了一 ...

  4. [转载] C#面向对象设计模式纵横谈——16 Interpreter解释器模式

    主讲:李建忠 来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD. ...

  5. 设计模式之解释器模式(Interpreter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. java interpreter_解释器模式(Interpreter)Java

    定义: 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 结构图: AbstractExpression解释器模式 ...

  7. 设计模式循序渐进(9)解释器模式 Interpreter

    通过解释器模式实现阿拉伯数字与罗马数字的相互转换. 具体的模式分析解说日后补发. Delphi代码: unit uInt2RomeInterpreter; { 单元说明:将整数转换为罗马数字      ...

  8. 解释器模式(行为模式)

    设计模式之Interpreter - 解释器模式             2008-06-24 10:41:46 分类: 项目管理 源地址:http://blog.chinaunix.net/uid- ...

  9. [设计模式-行为型]解释器模式(Interpreter)

    一句话 看起来是用来解释一种语言的文法.(类似不同的解释器子类解释不同的字符) 和编译器类似的解释器, 实际状况可能使用的比较少. 概括 解析 INTERPRETER-俺有一个<泡MM真经> ...

最新文章

  1. mysql数据库备份、恢复文档
  2. SessionStorage 和 LocalStorage 生命周期 以及 浏览器刷新操作意味着什么?
  3. webpack(2)--开发环境基本配置
  4. PHP爬虫音乐,PHPCrawl爬虫库实现抓取酷狗歌单
  5. iis php网站500错误原因_因为曾经错误安装过PHP5.2而导致IIS7无法正常工作,显示500错误提示,大家帮忙看看!...
  6. OSPF单域实验报告
  7. 【C++面向对象】类的大小以及虚继承
  8. mac下使用brew安装java等应用
  9. “萝莉变大妈”事件系主播策划!斗鱼出拳:永久封停!
  10. 201671010139 徐楠 关于学习继承
  11. mysql设计实例教程_MySQL数据库基础实例教程(微课版)
  12. python apply函数_Python中apply函数的用法实例教程
  13. 拖拉机大战更新了,更多新功能
  14. 大数据——Hadoop3.1.3安装与配置
  15. TMO (time-triggered message-triggered object)
  16. CPU扫盲-CPU如何执行指令以及流水线技术
  17. [转帖]中国民间秘术
  18. 华为android版本6.0,华为可升级Android8.0|EMUI6.0名单曝光,近20款,小米该加油了...
  19. 女子手机流量一夜疯跑了50GB
  20. 11 《痛苦与狂喜:米开朗基罗传》-豆瓣评分8.9

热门文章

  1. word中每页后面的空白怎么删掉
  2. python turtle画简易的太极图
  3. 图的遍历c语言数据结构实验报告,数据结构图的遍历实验报告.doc
  4. Java总结13 Lambda表达式 和 方法引用 的概念与应用
  5. 考研线性代数手写笔记2 矩阵
  6. PHP正则表达式修饰符
  7. Linux下安装bugzilla
  8. python web实战视频教程_2018Python Flask打造一个视频网站实战视频教程
  9. Centos7安装教程2022.2
  10. Redis中RDB操作