设计模式:interpreter模式
理解:可以广义的理解为创造一种语言,实现该语言的解释器,然后用创造的语言编写程序
对比:如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模式的更多相关文章
- Java设计模式(17)解释器模式(Interpreter模式)
Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...
- 设计模式(二十三)Interpreter模式
在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...
- linkin大话设计模式--常用模式总结
linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...
- Java设计模式----解释器模式
计算器中,我们输入“20 + 10 - 5”,计算器会得出结果25并返回给我们.可你有没有想过计算器是怎样完成四则运算的?或者说,计算器是怎样识别你输入的这串字符串信息,并加以解析,然后执行之,得出结 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]策略模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——迭代器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
随机推荐
- PHP利用FTP上传文件连接超时之开启被动模式解决方法
初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...
- spring boot actuator扩展httptrace的记录
SpringBoot记录HTTP请求日志 1.需求解读 需求: 框架需要记录每一个HTTP请求的信息,包括请求路径.请求参数.响应状态.返回参数.请求耗时等信息. 需求解读: Springboot框架 ...
- hystrix信号量和线程池的区别
- JavaWeb网上图书商城完整项目--day02-4.regist页面提交表单时对所有输入框进行校验
1.现在我们要将table表中的输入的参数全部提交到后台进行校验,我们提交我们是按照表单的形式提交,所以我们首先需要在table表外面添加一个表单 <%@ page language=" ...
- Code Walkthroughs Table API
上级:https://www.cnblogs.com/hackerxiaoyon/p/12747387.html Table API Table api 有批量的api和流实时的api.通常很容易进行 ...
- C#数据结构与算法系列(二十):插入排序算法(InsertSort)
1.介绍 插入排序算法属于内部排序算法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的 2.思想 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看 ...
- Selenium Grid的原理、配置与使用(转)
Selenium GridSelenium Grid在前面介绍Selenium的时候说过它有三大组件,Selenium Grid就是其中之一而作用就是分布式执行测试.讲分布式之前还是要说说UI自动化的 ...
- Python实用笔记 (8)高级特性——迭代
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 比如dict就可以迭代: >>> d = {'a ...
- Sql sever 声明变量,赋值变量
语句: --声明变量DECLARE @idcard nvarchar () , @rowid nvarchar () --给变量赋值SELECT @idcard = '{0}', @rowid = ' ...
- C# 接口(interface) 抽象类(abstract)
类代码: interface Employee { void ShowEmp(); } abstract class EmployeeInPostion: Employee { public abst ...