解释器模式(Interpreter模式)

解释器模式是一种设计模式,用于处理特定领域中复杂且重复出现的问题。它将问题表达为文法规则,通过构建解释器来解析和执行这些规则。当业务规则频繁变化且可抽象为语法规则时,此模式尤其适用。文中提供了C++代码示例,展示了如何创建TerminalInterpreter和NonTerminalInterpreter类来实现这一模式。
摘要由CSDN通过智能技术生成

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

结果运行图
result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值