背景
在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。
方法
给定一个语言,定义它的文法的一种表示,定义一种解释器,这个解释器使用该表示来解释语言中的句子。
适用于
解释器模式应用场合是:只有满足“业务规则频繁变化,而且类似的结构不断重复出现,并且容易抽象为语法规则的问题”才使用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<string>
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<iostream>
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<iostream>
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;
}
结果运行图