设计模式学习(二十一) 解释器模式 Interpreter

1.解释器模式的定义

 解释器模式的官方定义,即“给定一个语言,定义它的一种表示方法,并定义一个解释器。这个解释器使用该表示来解析语言中的句子。”通俗点来说,可以理解为密码的密码文和解密编号,原输入的句子为一个语言,其需要通过使用定义在解释器中的对应的解密方式来进行加工处理,从而得到需要的句子。解释器可以有多种,以实现对于不同情况下语言的解释处理工作。

2.解释器模式的类图

解释模式类图
 解释器模式的类图如图所示,Context环境类表示当前的文本环境,简单来说就是一段语句之类的的东西。而AbstreactExpression为解释器的抽象类,其中定义用于对当前文本环节Context的接口,而其余的实例解释器对象则实现这个接口,从而实现不同的解释器解释出的效果不同。

  1. Context环境类:其为解释器的解释对象输入类,其内部存储的数据以及需要解释的数据,均根据实际情况而定;
  2. AbstreactExpression解释器类:这是一个抽象类,其内部定义了实现解释过程的接口函数Interpret。当然也可以增加其他的功能函数;
  3. Expression解释器实例类:其继承自AbstractExpression解释器类,通过实现其中的Interpret接口,完成对解释器的解释功能的实现,并通过不同的解释器实例类中,函数接口实现的不同,实现解释器的不同;
  4. Client客户端:客户端只知道AbstreactExpression解释器类与Context环境类,在使用时,面向抽象类编程得到实例化的Expression解释器类,然后使用解释器对文本环境进行解释,得到所需要的结果。

3.解释器模式的代码实现

 本例所使用的情况较为简单,没有去实现密码解析类的功能,而是直接使用了前后缀添加的功能。
 具体地说,本例中使用File文件类表示Context环境类,使用Add类表示AbstreactExpression解释器类,其中定义了接口add,表示添加的功能;而使用AddSuffix_jpg和AddPrefix_mike表示添加.jpg后缀名和添加的[mike]的前缀名,其即为实例化的Expression解释器实例类。整体的实现过程较为简单,在解释器类中直接实现Context类中的数据改变,改变的是传入的Context类自身的参数,而不是一个临时的Context修改后再覆盖。

#include <iostream>
#include <string>
using namespace std;

class File
{
public:
	File(string name) : m_name(name) {}
	void setname(string name)
	{
		m_name = name;
	}
	string getname()
	{
		return m_name;
	}
private:
	string m_name;
};

class Add
{
public:
	virtual void add(File* file) = 0;
};

class AddPrefix_mike : public Add
{
public:
	void add(File* file) override
	{
		string addprefix = "[Mike]" + file->getname();
		file->setname(addprefix);
	}
};

class AddSuffix_jpg : public Add
{
public:
	void add(File* file) override
	{
		string addsuffix = file->getname() + ".jpg";
		file->setname(addsuffix);
	}
};

int main()
{
	File* picture1 = new File("Messi");
	File* picture2 = new File("James");

	Add* addprefix1 = new AddPrefix_mike;
	Add* addsuffix1 = new AddSuffix_jpg;

	cout << "picture1's name is " << picture1->getname() << endl;
	cout << "picture2's name is " << picture2->getname() << endl;
	addprefix1->add(picture1);
	addprefix1->add(picture2);
	cout << "picture1's name is " << picture1->getname() << endl;
	cout << "picture2's name is " << picture2->getname() << endl;
	addsuffix1->add(picture1);
	addsuffix1->add(picture2);
	cout << "picture1's name is " << picture1->getname() << endl;
	cout << "picture2's name is " << picture2->getname() << endl;

	delete picture1;
	delete picture2;
	delete addprefix1;
	delete addsuffix1;

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
解释器模式Interpreter Pattern)是一种行为型设计模式,它定义了一种语言文法的表示,并定义了一个解释器,用于解释语言中的句子。它将一个问题分成两个部分:一部分是语言的文法规则,另一部分是解释器,用来解释规则中的句子。解释器模式可以用于处理一些简单的语言,如数学表达式、正则表达式等。 实现方式: 1. 定义抽象表达式类(AbstractExpression),它是所有表达式类的父类,声明了抽象的解释方法。 2. 定义终结符表达式类(TerminalExpression),它实现了抽象表达式类中的解释方法,用于解释语言中的终结符。 3. 定义非终结符表达式类(NonterminalExpression),它也实现了抽象表达式类中的解释方法,用于解释语言中的非终结符。 4. 定义上下文类(Context),它包含了解释器需要的一些全局信息。 5. 客户端使用时,先创建一个上下文对象,然后将需要解释的语言句子作为参数传入解释器对象中,解释器对象将句子解释成相应的结果。 优点: 1. 可扩展性好,增加新的文法规则只需要添加相应的非终结符表达式类即可。 2. 易于实现语法分析。 缺点: 1. 对于复杂的文法规则,解释器模式的类数量可能会很大,增加程序的复杂性。 2. 执行效率较低,因为需要递归调用解释器对象。 适用场景: 1. 可以用于处理一些简单的语言,如数学表达式、正则表达式等。 2. 当语言的文法规则比较复杂时,可以使用解释器模式进行语法分析。 3. 当需要对语言进行增强时,可以使用解释器模式添加新的文法规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸间沧海桑田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值