大话设计模式--解释器模式 interpreter -- C++实现实例
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++实现实例的更多相关文章
- javascript设计模式 - 解释器模式(interpreter)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
- 设计模式:解释器模式(Interpreter)
为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...
- C#设计模式——解释器模式(Interpreter Pattern)
一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...
- 大话设计模式--访问者模式 Visitor -- C++实现实例
1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...
- 大话设计模式--命令模式 Command -- C++实现实例
1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...
- 大话设计模式--桥接模式 Bridge -- C++实现实例
1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...
- 大话设计模式--组合模式 Composite -- C++实现实例
1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...
- 大话设计模式--状态模式 State -- C++实现实例
1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类. 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类 ...
随机推荐
- $on、$emit和$broadcast的使用
$emit只能向parent controller传递event与data( $emit(name, args) ) $broadcast只能向child controller传递event与data ...
- centos root登录password 忘记解决的方法
Centos系统 登陆root忘记password 解决方式: (1)开机启动系统,在进入linux系统之前按键Esc 进入例如以下界面:(须要注意:Centos是安装在虚拟机里面的话,须要将鼠标点进 ...
- 使用Firebug进行断点调试详解
利用Firebug我们可以非常方便地对网页上的任何JavaScript代码进行断点调试. 首先,使用快捷键F12在当前页面打开Firebug,并切换到脚本选项卡. 其次,我们需要为指定的js代码添加断 ...
- iOS 日志系统 本地日志打包上传到服务器
日志系统主要包含两个部分 1.本地保存 我们知道NSLog打印的日志一般都是直接输出到控制台,开发人员可以在控制台直接看到实时打印的log,既然可以在控制台输出,那么能否将日志输出到其他地方呢,比如说 ...
- android Webview 实现js调用java代码实现Activity跳转
今天有了一个需求,在android里webview加载的html页面,要求点击html页面的按钮实现Activity的跳转. 咱是是菜鸟,webview的接触不多,于是就和度娘来了次亲密接触.在其中也 ...
- Weka学习之预处理连接MySql(二)
载入数据 (一)打开文件 (二) 打开url (三) 打开数据库 (四)从一些数据生成器(DataGenerators)中生成人造数据 这篇主要写(三)中的连接mySql 网上 ...
- ckediter一些小的问题解决办法
上传图片后,不能看到缩略图. 解决的方法是: BaseDir = "";Thumbnails.Dir = BaseDir + "_thumbs/"; 改为 Th ...
- 【JMeter4.0学习(十)】之JMeter函数简单运用以及结合正则表达式提取器
下面来简单的举个栗子: 首先,把函数和正则表达式提取器放在一块来介绍,如下所示: 1.结构完整展示,下面再一步一步创建添加: 2.添加线程组: 3.首先添加HTTP请求1 4.添加结果树后,运行后查看 ...
- zookeeper 客户端
http://blog.csdn.net/lzy_lizhiyang/article/details/48518731 http://blueyan.iteye.com/blog/2298276 ht ...
- python is == 的区别, 编码与解码.深浅拷贝
一. is == 的区别 双等表示的是判断是否相等, 注意. 这个双等比较的是具体的值.而不是内存地址 is 比较的是地址 编码回顾 除了了ASCII码以外, 其他信息不能直接转换 编码和解码的时 ...