C++ 设计模式之解释器模式

C++ 设计模式之解释器模式

简介

1、解释器模式(Interpreter)是一种行为型设计模式,它提供了一种方式来解释在语言中定义的文法或表达式。这种模式定义了一个解释器接口,该接口声明了一个解释方法,该方法对给定的上下文中的表达式进行解释。

2、解释器模式 (Interpreter)应用场景包括但不限于:

2.1、当一个特定类型的问题发生频率足够高时,可以考虑定义该问题的各种实例的语法规则,然后用解释器模式来解释。

2.2、当有一个简单的语言需要解释执行,并且可以将该语言中的语句表示为一个抽象的语法树时。

3、解释器模式 (Interpreter)的构成

3.1、抽象表达式(Abstract Expression):声明一个抽象接口,用于定义解释一个语法表达式所需要的接口。

c 复制代码
class Expression
{
public:
	virtual int interpret() const = 0;
	virtual ~Expression() = default;
};

3.2、具体表达式(Terminal Expression):实现了抽象表达式接口,对应于文法中的终结符(即不可再分的最小语法单元)。

c 复制代码
class Number : public Expression
{
public:
	explicit Number(int number);
	int interpret() const;

private:
	int number;
};

4、解释器模式 (Interpreter)的优点

4.1、可扩展性:易于改变和扩展文法。

4.2、可修改性:如果语言的一部分频繁更改,可以定义一个解释器来处理这部分,在需要修改时只需修改相应的解释器即可。

4.3、复用性:可以通过在不同的环境中使用表达式,重复使用现有的表达式。

5、解释器模式 (Interpreter)的缺点

5.1、复杂性:对于复杂的文法,可能需要建立很多的类,导致系统难以维护和理解。

5.2、效率问题:解释器模式会引入许多小对象的解释操作,可能会导致性能问题。

5.3、限定性:对于复杂的文法和高效解析的需求,此模式可能无法满足。

简单示例

1、定义

c 复制代码
// 表达式接口
class Expression
{
public:
	virtual int interpret() const = 0;
	virtual ~Expression() = default;
};

// 数字表达式
class Number : public Expression
{
public:
	explicit Number(int number);
	int interpret() const;

private:
	int number;
};

// 加法表达式
class Add : public Expression
{
public:
	Add(const std::shared_ptr<Expression>& left, const std::shared_ptr<Expression>& right);
	int interpret() const;

private:
	std::shared_ptr<Expression> leftOperand;
	std::shared_ptr<Expression> rightOperand;
};

// 减法表达式
class Subtract : public Expression
{
public:
	Subtract(const std::shared_ptr<Expression>& left, const std::shared_ptr<Expression>& right);
	int interpret() const;

private:
	std::shared_ptr<Expression> leftOperand;
	std::shared_ptr<Expression> rightOperand;
};

2、实现

c 复制代码
Number::Number(int number) : number(number)
{

}

int Number::interpret() const
{
	return number;
}

Add::Add(const std::shared_ptr<Expression>& left, const std::shared_ptr<Expression>& right) : leftOperand(left), rightOperand(right)
{

}

int Add::interpret() const
{
	return leftOperand->interpret() + rightOperand->interpret();
}

Subtract::Subtract(const std::shared_ptr<Expression>& left, const std::shared_ptr<Expression>& right) : leftOperand(left), rightOperand(right)
{

}

int Subtract::interpret() const
{
	return leftOperand->interpret() - rightOperand->interpret();
}

3、调用

c 复制代码
std::shared_ptr<Expression> expression = std::make_shared<Add>(
	std::make_shared<Number>(1),
	std::make_shared<Subtract>(
		std::make_shared<Number>(2),
		std::make_shared<Number>(3)
		)
	);
std::cout << "Result: " << expression->interpret() << std::endl;
相关推荐
stolentime1 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
syagain_zsx2 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官2 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
晚风予卿云月2 小时前
【C++高并发内存池】 1.定长内存池的实现
开发语言·c++·内存管理
闻缺陷则喜何志丹4 小时前
【c++20】协程与屏障
c++·算法·c++20·携程·屏障
会编程的小孩4 小时前
C++ 内存分区、堆与栈、static、union 完整修正版文档
c++
多弗朗皮卡丘4 小时前
C++的类型转换
开发语言·c++
火2254 小时前
# C++ 微服务即时通讯系统(三):网关设计——HTTP 请求、Session 鉴权与 WebSocket 通知上一篇
c++·http·微服务
工一木子4 小时前
设计模式与生活③:你的早晨,是一套模板
设计模式
C++ 老炮儿的技术栈5 小时前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c