一. 解释器模式

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

结构如下:

代码如下:

  1. //包含解释器之外的一些全局信息
  2. class Context
  3. {
  4. public:
  5. Context() {}
  6. ~Context() {}
  7. };
  8. class AbstractExpression
  9. {
  10. public:
  11. virtual ~AbstractExpression() {}
  12. virtual void Interpret(const Context& c) {}
  13. protected:
  14. AbstractExpression() {}
  15. };
  16. //终结符表达式
  17. class TerminalExpression:public AbstractExpression
  18. {
  19. public:
  20. TerminalExpression(const string& statement)
  21. {
  22. this->_statement = statement;
  23. }
  24. ~TerminalExpression(){}
  25. void Interpret(const Context& c)
  26. {
  27. cout<<this->_statement<<" Terminal Expression..."<<endl;
  28. }
  29. private:
  30. string _statement;
  31. };
  32. //非终结符表达式
  33. class NonterminalExpression:public AbstractExpression
  34. {
  35. public:
  36. NonterminalExpression(const string& statement)
  37. {
  38. this->_statement = statement;
  39. }
  40. ~NonterminalExpression() {}
  41. void Interpret(const Context& c)
  42. {
  43. cout<<this->_statement<<" Nonterminal Expression..."<<endl;
  44. }
  45. private:
  46. string _statement;
  47. };
  48. //测试代码
  49. int main(int argc,char* argv[])
  50. {
  51. Context* c = new Context();
  52. list<AbstractExpression*> ls;
  53. ls.push_back(new TerminalExpression("A"));
  54. ls.push_back(new NonterminalExpression("B"));
  55. ls.push_back(new TerminalExpression("C"));
  56. ls.push_back(new NonterminalExpression("D"));
  57. list<AbstractExpression*>::iterator it = ls.begin();
  58. for (it; it != ls.end(); ++it)
  59. {
  60. (*it)->Interpret(*c);
  61. }
  62. return 0;
  63. }


二. 说明

解释器模式就是用“迷你语言”来表现程序要解决的问题。

比如:在C语言解释器,当你输入 int 时,解释器就能正确的开辟一个 int 的空间出来。

再比如: linux 下常用的命令参数,如 ls -a,-a 就能被正确的解释成相应的命令。

优点:这种模式很容易改变和扩展文法,因为每个文法有一个文法类,也就是上面的表达式类。

缺点:当文法非常复杂时,要管理和维护很多个文法类。

设计模式C++描述----21.解释器(Iterpreter)模式的更多相关文章

  1. 设计模式之第21章-状态模式(Java实现)

    设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...

  2. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  3. 设计模式C++描述----22.访问者(Visitor)模式

    一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...

  4. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

  5. 设计模式C++描述----19.命令(Command)模式

    一. 举例说明 我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令.这里有几点需要说明: 1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数. ...

  6. 设计模式C++描述----17.备忘录(Memento)模式

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...

  7. 设计模式C++描述----16.状态(State)模式

    一. 举例 一般汽车发动机工作时有四种状态,吸气.压缩.做功和排气. 在运行时,不同的状态会有不同的行为,当前的状态机在适当的时候会过渡到下一状态. 其实用户在使用时根本不知道当前的状态,也无需知道当 ...

  8. 设计模式C++描述----15.策略(Strategy)模式

    一. 举例说明 以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法. 结构如下: Algorithm:抽象类,提供算法的公共接口. RSA_Algorith ...

  9. 设计模式C++描述----14.外观(Facade)模式

    一. 举例说明 还以我以前做的文件系统(FileSys)为例: 文件系统是一个独立的系统,它提供一套核心的文件操作. 除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统( ...

随机推荐

  1. F#周报2019年第40期

    新闻 将项目成熟度重新考虑为一个社区过程 介绍.NET Core Windows Form设计器预览1 F# 4.7可以预览新语言特性与语法 视频及幻灯片 DotnetConf2019展示 .NET设 ...

  2. CPU的物理数、核心数、线程数

    最近了解下CPU的参数,主要是对常见的CPU参数指标:物理数.核心数以及线程数做了下了解.增长了点自己的见识,方便自己回忆和分享,记录下来.参考了网上的一些说明并加以整理,形成该随笔.主要参考链接如下 ...

  3. vue.js入门代码

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. Python3 学习笔记之 IDLE

    IDLE: IDLE是Python标准发行版内置的一个简单小巧的IDE,包括了交互式命令行.编辑器.调试器等基本组件,足以应付大多数简单应用. 基本操作: File->New File 新建立p ...

  5. 微服务架构-利用Redis特性进行业务解耦

    背景:     接着上篇文章来,上篇文章讲的是如何利用ApplicationContext的事件机制来达到业务解耦,而且这只能作用在单体应用中.在当下这么盛行的微服务架构中,想要再利用此方案做业务解耦 ...

  6. html5一些特性

    html5可以理解为html+css+js 其目前可以解决:1.浏览器的兼容问题 2.统一web应用标准 3.解决文档结构定义不明确问题 4.解决web应用中的功能受限问题 5.是程序员编写的web应 ...

  7. spring源码分析系列4:ApplicationContext研究

    ApplicationContext接口 首先看一下一个最基本的上下文应该是什么样子 ApplicationContext接口的注释里写的很清楚: 一个基本applicationContext应该提供 ...

  8. ADB命令无法导出文件到物理机上处理办法

    因为想查看一下脚本生成的sqlite文件.就想导出文件,,结果导出adb pull命令一直报错.使用su也是错误的..最后发现adb pull 不能再adb的命令状态下执行.需要退出adb命令.然后直 ...

  9. 二次函数,为什么a>0就可以知道开口向上.

    最近自考. 学习高等数学. 学习高等数学过程中发现高中数学不会,,于是乎开始补高中数学. 学习高中数学过程中又发现初中数学有的不会,,于是乎开始补初中数学.. 可怕(→_→). 今天遇到一个二次函数, ...

  10. css浮动产生和清除浮动的几种方式

    浮动的语法:float:left/right; 浮动float的原本设计了作用初衷是为了实现文字环绕效果 浮动产生负作用: 1.背景不能显示 2.边框不能撑开父元素 3.margin padding设 ...