设计模式-解释器模式、装饰器模式

news/2025/2/25 8:18:06

解释器模式

定义

        给分析对象定义一个语言,并定义语言的文法表示,再设计一个解释器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。

类图

角色

  • 抽象表达式( Abstract Expression) 角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()

  • 终结符表达式(Terminal Expression) 角色: 是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每个终结符都有一个具体终结表达式与之相对应。

  • 非终结符表达式(Nonterminal Expression) 角色: 也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式

  • 环境(Context)角色: 通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

  • 客户端(Client) : 主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法

优缺点

  • 优点
    • 拓展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或拓展文法。
    • 容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。
  • 缺点
    • 执行效率低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。
    • 会引起类膨胀。解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
    • 可用的场景比较少。在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到

使用场景

  • 当语言的文法较为简单,且执行效率不是关键问题时

  • 当问题重复出现,且可以用一种简单的语言来进行表达时

  • 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如XML 文档解释

使用案例

  • Expression4J

  • Jep (Java表达式分析器)

  • Spring-expression <Spring中表达式语言spring-expression简单使用 - strongmore - 博客园>

  • 正则表达式 Pattern 类

装饰器模式

定义

        装饰器模式(Decorator Pattern) 也称为包装模式;是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案,属于结构型模式。装饰器模式的核心是功能拓展,使用装饰器模式可以透明且动态地拓展类的功能;

类图

角色

  • 抽象组件(Component):可以是一个接口或者抽象类,其充当被装饰类的原始对象,规定了被装饰对象的行为;

  • 具体组件(ConcreteCompomponent):实现/继承Component的一个具体对象,也即被装饰对象

  • 抽象装饰器(Decorator): 通用的装饰ConcreteComponent的装饰器,其内部必然有一个属性指向Component抽象组件;其实现一般是一个抽象类,主要是为了让其子类按照其构造形式传入一个Component抽象组件,这是强制的通用行为

  • 具体装饰器(ConcreteDecorator):Decorator的具体实现类,理论上,每个ConcreteDecorator都拓展了Component对象的一种功能;

优缺点

  • 优点
    • 装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象拓展功能,即插即用
    • 通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果
    • 装饰器完全遵守开闭原则
  • 缺点
    • 从代码层面来看,使用装饰器模式会出现更多的代码,更多的类,增加程序复杂性
    • 动态装饰时,多层装饰时会更复杂

使用场景

  • 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类

  • 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时采用继承关系很难实现,而采用装饰模式却很好实现

  • 当对象的功能要求可以动态地添加,也可以再动态地撤销时

使用案例

  • Java I/O 标准库的设计


http://www.niftyadmin.cn/n/5865242.html

相关文章

网络安全入门|从防护到溯源:HTTP慢速攻击的深度对抗

一、深度对抗中的四大核心问题 在HTTP慢速攻击的防护与溯源过程中,以下问题尤为突出: 检测精度不足 问题:传统基于阈值(如连接数、请求速率)的检测易被攻击者绕过(如分布式IP、动态调整攻击速率)。 案例:攻击者使用1000个代理IP,每个IP仅建立1个连接并发送1字节/分钟…

爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏

在智能手机高速迭代的今天&#xff0c;高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具&#xff0c;需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能&#xff0c;成为智能手机中不可或缺的精密时钟源&#xff0c;为通信、…

4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)

文章目录 前言代码示例&#xff1a;运行方法&#xff1a;查看结果&#xff1a;关键功能说明&#xff1a;扩展功能建议&#xff1a; 前言 以下是一个完整的SystemVerilog测试平台示例&#xff0c;包含约束随机地址生成、日志输出和波形生成功能&#xff1a; 代码示例&#xff1…

sailwind 安装提示找不到mfc140.dll安装Visual C++ Redistributable for Visual Studio 2015

sailwind 安装提示找不到mfc140.dll安装Visual C Redistributable for Visual Studio 2015 下载&#xff1a; https://www.microsoft.com/zh-cn/download/details.aspx?id48145&751be11f-ede8-5a0c-058c-2ee190a24fa6True) 如果链接失效就直接搜&#xff0c;有个微软官…

your HTTP request connection start duration too long

If your HTTP request connection start duration is taking more than 7 seconds, here are some possible causes and troubleshooting steps: Possible Causes: Network Latency – Slow internet or network congestion.DNS Resolution Delay – Slow DNS lookup affecti…

前端面试-webpack篇

Webpack的构建流程 Webpack 的构建流程可以总结为以下几个关键步骤&#xff1a; 初始化参数&#xff1a; 从配置文件和命令行参数中读取并合并配置&#xff0c;得到最终的构建参数。 开始编译&#xff1a; 初始化 Compiler 对象&#xff0c;加载所有配置的插件&#xff0c;执行…

基于SpringBoot + Vue的共享汽车(单车)管理系统设计与实现+毕业论文+开题报告+指导搭建视频

本系统包含管理员、用户两个角色。 管理员角色&#xff1a;个人中心管理、用户管理、投放地区管理、汽车信息管理、汽车投放管理、汽车入库管理、使用订单管理、汽车归还管理。 用户角色&#xff1a;注册登录、汽车使用下单、汽车归还。 本共享汽车管理系统有管理员和用户。管…

Vi 编辑器基本使用指南

一、Vi 编辑器的启动与退出 启动 Vi 编辑器 在终端中&#xff0c;输入vi加上要编辑的文件名&#xff0c;如vi example.txt&#xff0c;如果example.txt存在&#xff0c;Vi 编辑器会打开该文件&#xff1b;若不存在&#xff0c;则会创建一个新的空文件并打开。如果只输入vi&am…