设计模式(C++)-行为型模式-解释器模式

设计模式(C++)-行为型模式-解释器模式

一、解释器模式概述

解释器模式(Interpreter Pattern):是一种行为型模式,用于定义语言的文法规则,并建立一个解释器来解释该语言中的句子。
核心思想 :将语言中的每个语法规则表示为一个类,通过组合这些类的实例来构建语法抽象树,然后遍历这颗树来解释执行。
应用场景 :

  • 1、应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
  • 2、一些重复出现的问题可以用一种简单的语言来表达
  • 3、一个简单语法需要解释的场景
  • 4、这样的例子还有,比如编译器、运算表达式计算、正则表达式、机器人等

二、解释器模式UML类图

解释器场景

假设现在我们需要实现一个算术表达式的解释器,具体UML类图如下:

三、代码实现

cpp 复制代码
//interpreter.h
#pragma once
/*Interpreter 模式(解释器模式)
- 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,
最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器
- 解释器模式(Interpreter Pattern):是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,
使用该解释器来解释语言中的句子(表达式)
- 应用场景:
- 1、应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
- 2、一些重复出现的问题可以用一种简单的语言来表达
- 3、一个简单语法需要解释的场景
- 4、这样的例子还有,比如编译器、运算表达式计算、正则表达式、机器人等
优点:
- 可扩展性比较好,灵活。
- 增加了新的解释表达式的方式。
- 易于实现简单文法。
缺点:
- 可利用场景比较少。
- 对于复杂的文法比较难维护。
- 解释器模式会引起类膨胀。
- 解释器模式采用递归调用方法
*/
#include <iostream>
#include <string>
using namespace std;
//抽象表达式类
class IExpression{
public:
	virtual ~IExpression() {};
	virtual int evaluate() = 0;
};
//终结符表达式 - 数字
class NumberExpression:public IExpression {
public:
	NumberExpression(int val) :m_value(val) {}
	virtual int evaluate()override;
private:
	int m_value;
};
//非终结符表达式 - 加法
class AddExpression:public IExpression{
public:
	AddExpression(IExpression *l, IExpression *r) : left(l), right(r) {}
	virtual int evaluate()override;
private:
	IExpression *left;
	IExpression *right;
};

// 非终结符表达式 - 减法
class SubtractExpression : public IExpression {
private:
	IExpression *left;
	IExpression *right;
public:
	SubtractExpression(IExpression *l, IExpression *r) : left(l), right(r) {}
	virtual int evaluate() override;
};

void testInterPreter();
//interpreter.cc
#include "interpreter.h"
int NumberExpression::evaluate() {
	return m_value;
}
int AddExpression::evaluate() {
	return left->evaluate() + right->evaluate();
}
int SubtractExpression::evaluate() {
	return left->evaluate() - right->evaluate();
}
void testInterPreter() {
	cout << "=================InterPreter begin===============" << endl;
	IExpression *num1 = new NumberExpression(5);
	IExpression *num2 = new NumberExpression(3);

	IExpression *addExpr = new AddExpression(num1, num2);
	IExpression *subExpr = new SubtractExpression(num1, num2);

	std::cout << "加法结果: " << addExpr->evaluate() << std::endl;
	std::cout << "减法结果: " << subExpr->evaluate() << std::endl;

	delete num1;
	delete num2;
	delete addExpr;
	delete subExpr;
	cout << "=================InterPreter begin===============" << endl;
}

四 优缺点总结

优点:

  • 可扩展性好,灵活
  • 增加了新的解释表达式的方式
  • 易于实现简单文法

缺点:

  • 可利用场景比较少
  • 对于复杂的文法比较难维护
  • 解释器模式会引起类膨胀
  • 解释器模式采用递归调用方法
相关推荐
博风24 分钟前
13、设计模式应用举例:工厂方法模式:创建药品对象
设计模式·工厂方法模式
音草44 分钟前
C++ 继承详解:从概念到菱形继承
c++
weixin_307779131 小时前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》Trae IDE 开发环境搭建与依赖管理
c++·ide·语言模型
沫璃染墨2 小时前
《Qt从零入门系列(十四):QThread多线程详解——从线程创建到客户端阻塞处理》
开发语言·c++·笔记·qt·ui·交互·线程
草莓熊Lotso2 小时前
【C++ 基于微服务的即时通讯系统】Elasticsearch 从安装到 C++ 客户端二次封装全落地
linux·网络·数据库·c++·elasticsearch·微服务
CHPCWWHSU2 小时前
FreeCAD 源码解读:从 Property 到 Command,看一套 CAD 内核的完整闭环
c++·cad
代钦塔拉2 小时前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式
aqiu1111113 小时前
蓝桥杯真题复盘:Fibonacci 数列与黄金分割(C++ 算法详解)
c++·算法·蓝桥杯
lojox3 小时前
C++ 手写 STL list(双向循环链表)原理剖析与实现
c++·链表·list