解释器模式(Interpreter模式)

背景
在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。
方法
给定一个语言,定义它的文法的一种表示,定义一种解释器,这个解释器使用该表示来解释语言中的句子。
适用于
解释器模式应用场合是:只有满足“业务规则频繁变化,而且类似的结构不断重复出现,并且容易抽象为语法规则的问题”才使用Interpreter模式。
特点
使用解释器模式来表述文法规则,从而可以使用面向对象技巧来方便地“扩展”文法。
解释器模式比较适合简单的文法表示,对于复杂的文法表示,解释器模式会产生比较大的类层次结构,需要求助于语法分析生成器这样标准的工具。
C++代码实现

//Context.h
#pragma once
class Context {
public:
	~Context();
	Context();
};
//Context.cpp
#include"Context.h"
Context::Context() {

}
Context::~Context() {

}
//Interpreter.h
#pragma once
#include
using namespace std;
class Context;
class Interpreter {
public:
	virtual ~Interpreter();
	virtual void Interprete(const Context& context);
protected:
	Interpreter();
};
class TerminalInterpreter :public Interpreter {
public:
	void Interprete(const Context& context);
	TerminalInterpreter(const string& str);
	~TerminalInterpreter();
private:
	string str;
};
class NoterminalInterpreter :public Interpreter {
public:
	NoterminalInterpreter(Interpreter* interpreter, int times);
	~NoterminalInterpreter();
	void Interprete(const Context& context);
private:
	int times;
	Interpreter* interpreter;
};
//Interpreter.cpp
#include"Context.h"
#include"Interpreter.h"
#include
using namespace std;
Interpreter::Interpreter() {

}
Interpreter::~Interpreter() {

}
void Interpreter::Interprete(const Context& context) {

}
TerminalInterpreter::TerminalInterpreter(const string& str) {
	this->str = str;
}
TerminalInterpreter::~TerminalInterpreter() {

}
void TerminalInterpreter::Interprete(const Context& context) {
	cout << "TerminalInterpreter::Interprete:" << this->str << endl;
}
NoterminalInterpreter::NoterminalInterpreter(Interpreter* interpreter, int times) {
	this->interpreter = interpreter;
	this->times = times;
}
NoterminalInterpreter::~NoterminalInterpreter() {

}
void NoterminalInterpreter::Interprete(const Context& context) {
	for (int i = 0; i < times; i++) {
		cout << "times:" << i << ":NoterminalInterpreter::Interprete" << endl;
		this->interpreter->Interprete(context);
	}
}
//Main.cpp
#include"Context.h"
#include"Interpreter.h"
#include
using namespace std;
int main() {
	Context* context = new Context();
	Interpreter* interpreter = new TerminalInterpreter("hello");
	Interpreter* nointerpreter = new NoterminalInterpreter(interpreter, 3);
	nointerpreter->Interprete(*context);
	return 0;
}

结果运行图
解释器模式(Interpreter模式)_第1张图片

你可能感兴趣的:(#,C++设计模式,解释器模式,c++,算法)