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. u3D大场景的优化

    首先介绍下draw call(这个东西越少你的游戏跑的越快): 在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏幕上 ...

  2. junit测试时报No runnable methods错误的解决方法

    1.因为你@Test时import的是@org.testng.annotations.Test所以会报错 解决方法:改为import org.junit.Test;就可以了

  3. Crashing Robots - poj 2632

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8352   Accepted: 3613 Description In ...

  4. Markdown GUI编辑器推荐 windows mac

    windows 1. MarkdownPad 如果右边不能预览: LivePreview is not working - it displays an error message stating T ...

  5. jq 获取页面中checkbox已经选中的checkbox

    var array={}; var arrChk=$("input[name='bike']:checked"); if(arrChk.length<=0){ alert(' ...

  6. 值类型,Nullable类型

    1. 值类型 比如说int吧,是值类型,是个struct,是这样声明的 public struct Int32 : IComparable, IFormattable, IConvertible, I ...

  7. Unity3d音乐

    public  AudioClip  routineAudio; public  AudioClip  gameAudio; public  AudioClip  RewardAudio; publi ...

  8. 模型层TP框架数据库的操作

    在shop入口的文件下的HOME文件夹中使用模型层 第一步修改配置模块把数据库的各种链接做好,打开HOME中的conf文件夹中的config.php,找到Thinkphp文件加下的conf文件打开co ...

  9. 【BZOJ4154】[Ipsc2015]Generating Synergy KDtree

    [BZOJ4154][Ipsc2015]Generating Synergy Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问 ...

  10. bash批量去前缀

    #!/bin/sh for aFile in *; do oldfile=`basename "$aFile"` newfile=${oldfile::} echo ${oldfi ...