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

如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

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

实例:

context.h  context.cpp  需要解释的文本内容

#ifndef CONTEXT_H
#define CONTEXT_H #include <string>
using namespace std; class Context
{
public:
Context();
string input;
string output;
}; #endif // CONTEXT_H
#include "context.h"

Context::Context()
{
input = "";
output = "";
}

abstractexpression.h abstractexpression.h   抽象解释器,具有统一的解释器接口

#include "context.h"

class AbstractExpression
{
public:
AbstractExpression();
void virtual interpret(Context *context)=0;
}; #endif // ABSTRACTEXPRESSION_H
#include "abstractexpression.h"

AbstractExpression::AbstractExpression()
{
}

terminalexpression.h terminalexpression.cpp  具体的解释器1,方法interpret中应该是对Context的解释。。

#ifndef TERMINALEXPRESSION_H
#define TERMINALEXPRESSION_H #include "abstractexpression.h"
#include "context.h" class TerminalExpression : public AbstractExpression
{
public:
TerminalExpression();
void interpret(Context *context);
}; #endif // TERMINALEXPRESSION_H
#include "terminalexpression.h"
#include <iostream>
using namespace std; TerminalExpression::TerminalExpression()
{
} void TerminalExpression::interpret(Context* context)
{
cout << "Terminal Expression --> context" << endl;
}

nonterminalexpression.h nonterminalexpression.cpp  具体解释器2

#ifndef NONTERMINALEXPRESSION_H
#define NONTERMINALEXPRESSION_H #include "abstractexpression.h"
#include "context.h" class NonterminalExpression : public AbstractExpression
{
public:
NonterminalExpression();
void interpret(Context *context);
}; #endif // NONTERMINALEXPRESSION_H
#include "nonterminalexpression.h"
#include <iostream>
using namespace std; NonterminalExpression::NonterminalExpression()
{
} void NonterminalExpression::interpret(Context *context)
{
cout << "Non-Terminal Expression --> context" << endl;
}

main.cpp

#include <iostream>
#include "context.h"
#include "terminalexpression.h"
#include "nonterminalexpression.h"
using namespace std; int main()
{
cout << "Interpreter test!" << endl; Context *context = new Context();
AbstractExpression *t = new TerminalExpression();
AbstractExpression *n = new NonterminalExpression();
t->interpret(context);
n->interpret(context); return 0;
}

大话设计模式--解释器模式 interpreter -- C++实现实例的更多相关文章

  1. javascript设计模式 - 解释器模式(interpreter)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

  3. 设计模式:解释器模式(Interpreter)

    为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...

  4. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  5. 大话设计模式--访问者模式 Visitor -- C++实现实例

    1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...

  6. 大话设计模式--命令模式 Command -- C++实现实例

    1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...

  7. 大话设计模式--桥接模式 Bridge -- C++实现实例

    1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...

  8. 大话设计模式--组合模式 Composite -- C++实现实例

    1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...

  9. 大话设计模式--状态模式 State -- C++实现实例

    1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类. 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类 ...

随机推荐

  1. css 控制文本显示两行 超过省略号显示

    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; word-break: break-all; ov ...

  2. pip或者anacnda安装opencv以及opencv-contrib

    一条命令就可以搞定: pip install opencv-contrib-python   opencv-python 或者: pip install opencv-contrib-python== ...

  3. IIS8应用池重启脚本

    重启 IIS8 应用程序池的批处理 批处理很简单:c:\windows\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"ASP ...

  4. mysql导出数据库提示警告在GTID模式下面

    [root@db02 tmp]# mysqldump -S /tmp/mysql.sock -A -R --triggers --master-data=2 --single-transaction ...

  5. oracle10g安装问题

    oracle10g的安装还是比较容易的,一直下一步就行了,但是今天安装的时候遇到了一个新问题,在安装的过程中提示提示一些 Configuration Assistant失败刚开始,我直接跳过去,但后面 ...

  6. atom常用插件安装

    安装插件方法: File -Settings -Install 在搜索框里搜索你想要的插件,出来之后 点击install ,下图以 linter-selint 为例 ATOM常用插件推荐 simpli ...

  7. Unity3D研究院之在开始学习拓展编辑器

    Unity拥有非常丰富的拓展编辑器接口,如果是在网上下载过别人写的插件,你会发现为什么它的监测面板视图和普通的不一样?其实是他通过代码自己绘制的监测面板,这篇博文MOMO带大家来学习编辑器.如下图所示 ...

  8. JQuery基础知识--方便忘记时查看

    第一次写博客,不多说废话,实用为先.如有不对,请多指正. JQuery api 第一步引入JQuery库. <script type="text/javascript" sr ...

  9. php之 人员的权限管理

    1.想好权限管理的作用? 2.有什么权限内容? 3.既然有权限管理那么就会有管理员? 4.登录后每个人员的界面会是不一样的? 一.想好这个权限是什么? 就做一个就像是vip的功能,普通用户和vip用户 ...

  10. 反素数ant(数学题)

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2872  Solved: 1639[Submit][St ...