理解:可以广义的理解为创造一种语言,实现该语言的解释器,然后用创造的语言编写程序

对比:如xml就是一种语言,解析xml的代码就是解释器

例子:

//目标:定义4中几种命令,使用C++解析
//如下:
//command go end
//command back end
//command right end
//command left end
//repeat 4 go back end
//command left left left end
class Command
{
public:
virtual void excute() = 0;
}; class GoCommand: public Command
{
public:
virtual void excute()
{
cout << "Go";
}
}; class BackCommand: public Command
{
public:
virtual void excute()
{
cout << "Back";
}
}; class LeftCommand: public Command
{
public:
virtual void excute()
{
cout << "Left";
}
}; class RightCommand: public Command
{
public:
virtual void excute()
{
cout << "Right";
}
}; class CommandList: public Command
{
protected:
vector<Command*> v;
public:
virtual void excute()
{
for(vector<Command*>::iterator it=v.begin(); it!=v.end(); ++it)
{
cout << " ";
(*it)->excute();
cout << endl;
}
} void addCommand(Command* command)
{
v.push_back(command);
} ~CommandList()
{
for(vector<Command*>::iterator it=v.begin(); it!=v.end(); ++it)
{
delete (*it);
}
}
}; class RepeatCommand: public CommandList
{
int repeat;
public:
RepeatCommand(int repeat)
{
this->repeat = repeat;
} virtual void excute()
{
for(int i=0; i<repeat; i++)
{
for(vector<Command*>::iterator it=v.begin(); it!=v.end(); ++it)
{
cout << " ";
(*it)->excute();
}
}
}
};
CommandList *program = NULL;

void SplitString(const string& s, vector<string>& v, const string& c)
{
string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = 0;
while(string::npos != pos2)
{
v.push_back(s.substr(pos1, pos2-pos1)); pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if(pos1 != s.length())
v.push_back(s.substr(pos1));
return;
} void ParseLine(vector<string>& v, CommandList* commandList)
{
if(v.front() == string("command"))
{
if(v.back() == string("end"))
{
vector<string> sub(v);
sub.erase(sub.begin());
sub.erase(sub.end());
ParseLine(sub, commandList);
}
else
{
cout << "Parse error1" << endl;
} }
else if(v.front() == string("repeat"))
{
if(v.back() == string("end"))
{
vector<string> sub(v);
sub.erase(sub.begin());
sub.erase(sub.end()); istringstream is(sub[0]);
int i = 0;
is >> i; RepeatCommand* reptCmd = new RepeatCommand(i);
commandList->addCommand(reptCmd); sub.erase(sub.begin());
ParseLine(sub, reptCmd); }
else
{
cout << "Parse error1" << endl;
}
}
else if(v.front() == string("go"))
{
commandList->addCommand(new GoCommand);
vector<string> sub(v);
sub.erase(sub.begin());
if(sub.size() > 0)
{
ParseLine(sub, commandList);
}
}
else if(v.front() == string("back"))
{
commandList->addCommand(new BackCommand);
vector<string> sub(v);
sub.erase(sub.begin());
if(sub.size() > 0)
{
ParseLine(sub, commandList);
}
}
else if(v.front() == string("left"))
{
commandList->addCommand(new LeftCommand);
vector<string> sub(v);
sub.erase(sub.begin());
if(sub.size() > 0)
{
ParseLine(sub, commandList);
}
}
else if(v.front() == string("right"))
{
commandList->addCommand(new RightCommand);
vector<string> sub(v);
sub.erase(sub.begin());
if(sub.size() > 0)
{
ParseLine(sub, commandList);
}
}
else
{
cout << "Parse error0" << endl;
}
} void Parse(string name)
{
program = new CommandList(); ifstream infile(name.c_str());
string cmd;
vector<string> v;
while(getline(infile, cmd))
{
v.clear();
SplitString(cmd, v, " ");
ParseLine(v, program);
}
infile.close();
}
int main()
{
Parse(string("abc.txt"));
program->excute(); return 0;
}

设计模式:interpreter模式的更多相关文章

  1. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

  2. 设计模式(二十三)Interpreter模式

    在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...

  3. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  4. Java设计模式----解释器模式

    计算器中,我们输入“20 + 10 - 5”,计算器会得出结果25并返回给我们.可你有没有想过计算器是怎样完成四则运算的?或者说,计算器是怎样识别你输入的这串字符串信息,并加以解析,然后执行之,得出结 ...

  5. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  6. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  7. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  9. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  10. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

随机推荐

  1. JavaWeb网上图书商城完整项目--day02-17.登录功能页面实现

    1.当在登陆页面点击登陆按钮的时候,会调用UserServlet的login方法,我们要在login.jsp中进行配置 2.要在login.jsp中处理Servlet在后台业务操作之后forward到 ...

  2. linux shell编程子bash变量

    参考视频:https://www.imooc.com/u/279399/courses?sort=publish https://www.imooc.com/video/6516 慕课网 用户的自定义 ...

  3. activiti学习笔记一

    activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...

  4. 入门大数据---安装ClouderaManager,CDH和Impala,Hue,oozie等服务

    1.要求和支持的版本 (PS:我使用的环境,都用加粗标识了.) 1.1 支持的操作系统版本 操作系统 版本 RHEL/CentOS/OL with RHCK kernel 7.6, 7.5, 7.4, ...

  5. 进度条的使用 Progress控件

    MFC编程实例二:进度条的使用 2011-03-22 09:09:09|  分类: C++(C语言) |  标签:进度  nlower  nupper  添加  mfc  |字号 订阅    本人用的 ...

  6. 【差分】Tallest Cow

    题目 FJ's N(1≤N≤10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive ...

  7. Js中各种类型的变量在if条件中是true还是false

    如果操作数是一个对象,返回true如果操作数是一个空字符串,返回false如果操作数是一个非空字符串,返回true如果操作数是数值0,返回false如果操作数是任意非0数值(包括Infinity),返 ...

  8. 03 . Shell数组和函数

    Shell数组 简介 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. S ...

  9. 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制

    8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...

  10. 从发布-订阅模式谈谈 Flask 的 Signals

    发布-订阅模式 发布-订阅模式,顾名思义,就像大家订报纸一样,出版社发布不同类型的报纸杂志不同的读者根据不同的需求预定符合自己口味的的报纸杂志,付费之后由邮局安排人员统一派送. 上面一段话,提到了发布 ...