设计模式C++描述----21.解释器(Iterpreter)模式
一. 解释器模式
定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子。
结构如下:
代码如下:
- //包含解释器之外的一些全局信息
- class Context
- {
- public:
- Context() {}
- ~Context() {}
- };
- class AbstractExpression
- {
- public:
- virtual ~AbstractExpression() {}
- virtual void Interpret(const Context& c) {}
- protected:
- AbstractExpression() {}
- };
- //终结符表达式
- class TerminalExpression:public AbstractExpression
- {
- public:
- TerminalExpression(const string& statement)
- {
- this->_statement = statement;
- }
- ~TerminalExpression(){}
- void Interpret(const Context& c)
- {
- cout<<this->_statement<<" Terminal Expression..."<<endl;
- }
- private:
- string _statement;
- };
- //非终结符表达式
- class NonterminalExpression:public AbstractExpression
- {
- public:
- NonterminalExpression(const string& statement)
- {
- this->_statement = statement;
- }
- ~NonterminalExpression() {}
- void Interpret(const Context& c)
- {
- cout<<this->_statement<<" Nonterminal Expression..."<<endl;
- }
- private:
- string _statement;
- };
- //测试代码
- int main(int argc,char* argv[])
- {
- Context* c = new Context();
- list<AbstractExpression*> ls;
- ls.push_back(new TerminalExpression("A"));
- ls.push_back(new NonterminalExpression("B"));
- ls.push_back(new TerminalExpression("C"));
- ls.push_back(new NonterminalExpression("D"));
- list<AbstractExpression*>::iterator it = ls.begin();
- for (it; it != ls.end(); ++it)
- {
- (*it)->Interpret(*c);
- }
- return 0;
- }
二. 说明
解释器模式就是用“迷你语言”来表现程序要解决的问题。
比如:在C语言解释器,当你输入 int 时,解释器就能正确的开辟一个 int 的空间出来。
再比如: linux 下常用的命令参数,如 ls -a,-a 就能被正确的解释成相应的命令。
优点:这种模式很容易改变和扩展文法,因为每个文法有一个文法类,也就是上面的表达式类。
缺点:当文法非常复杂时,要管理和维护很多个文法类。
设计模式C++描述----21.解释器(Iterpreter)模式的更多相关文章
- 设计模式之第21章-状态模式(Java实现)
设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...
- 设计模式C++描述----09.桥接(Bridge)模式
一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...
- 设计模式C++描述----22.访问者(Visitor)模式
一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...
- 设计模式C++描述----20.迭代器(Iterator)模式
一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...
- 设计模式C++描述----19.命令(Command)模式
一. 举例说明 我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令.这里有几点需要说明: 1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数. ...
- 设计模式C++描述----17.备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...
- 设计模式C++描述----16.状态(State)模式
一. 举例 一般汽车发动机工作时有四种状态,吸气.压缩.做功和排气. 在运行时,不同的状态会有不同的行为,当前的状态机在适当的时候会过渡到下一状态. 其实用户在使用时根本不知道当前的状态,也无需知道当 ...
- 设计模式C++描述----15.策略(Strategy)模式
一. 举例说明 以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法. 结构如下: Algorithm:抽象类,提供算法的公共接口. RSA_Algorith ...
- 设计模式C++描述----14.外观(Facade)模式
一. 举例说明 还以我以前做的文件系统(FileSys)为例: 文件系统是一个独立的系统,它提供一套核心的文件操作. 除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统( ...
随机推荐
- Java初中级面试笔记及对应视频讲解
笔试题链接:点击打开链接 密码:提取码:7h9e 视频下载链接: 点击打开链接 提取码:hyye 百万it课程 https://pan.baidu.com/s/1ldJ_Ak7y0VL5Xmy9 ...
- Kubernetes 系列(二):Deployment 扩容
(1)首先我们创建一个nginx的Deployment,采用官方的yaml: kubectl create -f https://kubernetes.io/docs/user-guide/nginx ...
- python的__name__ == \'__main__\' 意义
转自http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...
- mac 安装redis及phpredis扩展
下载phpredis扩展安装包.git clone https://github.com/nicolasff/phpredis.git: 解压后,进入该目录: 依次执行以下操作完成安装: /Appli ...
- java中的String是不可变类
String s = "hello "; s += "world"; 这两行代码执行后,原始的String对象中的内容没有变 在这段代码中,s原先指向一个Str ...
- CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算?
CSS 选择符有哪些? 1.id选择器(#id) 2.类选择器(.class) 3.标签选择器(div,h1,p) 4.相邻选择器(h1 + p) 5.子选择器(ul > li) 6.后代选择器 ...
- 在我的新书里,尝试着用股票案例讲述Python爬虫大数据可视化等知识
我的新书,<基于股票大数据分析的Python入门实战>,预计将于2019年底在清华出版社出版. 如果大家对大数据分析有兴趣,又想学习Python,这本书是一本不错的选择.从知识体系上来看, ...
- MRP进程起不来, 报错:ORA-00600: internal error code, arguments: [2619], [227424], [], [], [], [], [], [], [], [], [], []
问题背景:客户数据库服务架构为一主一备,某日备库操作系统意外重启,重启后Oracle MRP进程起不来,报错:ORA-00600: internal error code, arguments: [2 ...
- MakaJs:基于 React, Redux 的轻量级前端框架
github: maka.js 留下您宝贵的STAR!谢谢 maka maka源于中文码咖,意为写代码的大咖 一眼即可看懂的前端框架,简约而不简单 1.安装 bash sudo npm i -g @m ...
- python编程基础之十二
列表:一种有序的集合,可以同时存储多个数据,列表元素可修改,属于可变序列 创建列表: 列表名 = [列表选项一,列表选项二,列表选项三,......] list1 = [] list2 = [10,2 ...