当前位置: 首页 > news >正文

Linux C++ 058-设计模式之解释器模式

Linux C++ 058-设计模式之解释器模式

本节关键字:Linux、C++、设计模式、解释器模式
相关库函数:

概念

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。

解释器模式用于构建一个能够解释特定语言或文法的句子的解释器。解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

这种模式被用在 SQL 解析、符号处理引擎等。

优缺点

优点

可扩展性好:容易添加新的解释表达式的方式。
灵活性:可以根据需要轻松扩展或修改文法。
易于实现简单文法:对于简单的语言,实现起来相对容易。

缺点

使用场景有限:只适用于适合使用解释的简单文法。
维护困难:对于复杂的文法,维护和扩展变得困难。
类膨胀:可能会产生很多类,每个文法规则对应一个类。
递归调用:解释器模式通常使用递归调用,这可能难以理解和跟踪。

使用场景

当某一特定类型的问题频繁出现,并且可以通过一种简单的语言来表达这些问题的实例时。
在需要解释执行语言中的句子时,考虑使用解释器模式。
确保文法简单,以避免系统变得过于复杂。

角色说明

解释器模式包含以下几个主要角色:

抽象表达式(Abstract Expression):定义了解释器的抽象接口,声明了解释操作的方法,通常是一个抽象类或接口。

终结符表达式(Terminal Expression):实现了抽象表达式接口的终结符表达式类,用于表示语言中的终结符(如变量、常量等),并实现了对应的解释操作。

非终结符表达式(Non-terminal Expression):实现了抽象表达式接口的非终结符表达式类,用于表示语言中的非终结符(如句子、表达式等),并实现了对应的解释操作。

上下文(Context):包含解释器之外的一些全局信息,在解释过程中提供给解释器使用,通常用于存储变量的值、保存解释器的状态等。

客户端(Client):创建并配置具体的解释器对象,并将需要解释的表达式传递给解释器进行解释。

示例代码

#include <iostream>
#include <string>
using namespace std;class Expression
{
public:Expression() {}bool interpret(string context);
};
class TerminalExpression : public Expression
{
public:TerminalExpression() {}TerminalExpression(string data) {m_Data = data;}bool interpret(string context) {if (context.find(m_Data) != -1)return true;return false;}
private:string		m_Data;
};
class OrExpression : public Expression
{
public:OrExpression() {}OrExpression(Expression *expr1, Expression *expr2) {m_Expr1 = expr1;m_Expr2 = expr2;}bool interpret(string context) {return m_Expr1->interpret(context) || m_Expr2->interpret(context);}
private:Expression		*m_Expr1;Expression		*m_Expr2;
};
class AndExpression : public Expression
{
public:AndExpression() {}AndExpression(Expression *expr1, Expression *expr2) {m_Expr1 = expr1;m_Expr2 = expr2;}bool interpret(string context) {return m_Expr1->interpret(context) && m_Expr2->interpret(context);}
private:Expression		*m_Expr1;Expression		*m_Expr2;
};
class InterpreterPatternDemo
{
public:InterpreterPatternDemo() {}//规则:Robert 和 John 是男性static Expression *getMaleExpression() {Expression *rober = new TerminalExpression("Robert");Expression *john = new TerminalExpression("John");return (Expression *)(new OrExpression(rober, john));}//规则:Julie 是一个已婚的女性static Expression *getMarriedWomanExpression() {Expression *julie = new TerminalExpression("Julie");Expression *married = new TerminalExpression("Married");return (Expression *)(new AndExpression(julie, married));}
};
//
int main(int argc, char *argv[])
{Expression *isMale = InterpreterPatternDemo::getMaleExpression();Expression *isMarriedWoman = InterpreterPatternDemo::getMarriedWomanExpression();cout << "John is male? " << isMale->interpret("John");cout << "Julie is a married women? " << isMarriedWoman->interpret("Married Julie");delete isMale;delete isMarriedWoman;return 0;
}
/*
John is male? true
Julie is a married women? true
*/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Perl 语言的特点
  • MyBatis中的优点和缺点?
  • Linux开发板上拷贝文件
  • ES6 数组的扩展(十六)
  • Python面试宝典第15题:岛屿数量
  • CentOS6minimal安装nginx-1.26.1.tar.gz 笔记240718
  • 使用Docker 实现 MySQL 循环复制(三)
  • 持续集成08--Jenkins邮箱发送构建信息及测试报告
  • js vue axios post 数组请求参数获取转换, 后端go参数解析(gin框架)全流程示例
  • Docker-compose单机容器集群编排
  • 记录一下在Hyper-v中动态磁盘在Ubuntu中不完全用到的问题(扩展根目录)
  • 41 QOS技术(服务质量)
  • <数据集>光伏板缺陷检测数据集<目标检测>
  • 双非一本嵌入式方向怎么学?
  • 逻辑门的题目怎么做?
  • isset在php5.6-和php7.0+的一些差异
  • Python连接Oracle
  • Quartz初级教程
  • Spring Cloud中负载均衡器概览
  • Vue 重置组件到初始状态
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 机器学习学习笔记一
  • 坑!为什么View.startAnimation不起作用?
  • 力扣(LeetCode)357
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 微信支付JSAPI,实测!终极方案
  • 想写好前端,先练好内功
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • puppet连载22:define用法
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​浅谈 Linux 中的 core dump 分析方法
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # wps必须要登录激活才能使用吗?
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四) Graphivz 颜色选择
  • (算法)N皇后问题
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)C#调用WebService 基础
  • (轉)JSON.stringify 语法实例讲解
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net MySql
  • .NET 发展历程
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)