设计模式 - 解释器模式

news2024/11/17 16:38:47

目录

一. 前言

二. 实现

三. 优缺点


一. 前言

    解释器模式(Interpreter Pattern)指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子,属于行为型设计模式。是一种按照规定的文法(语法)进行解析的模式。其核心思想就是识别文法,构建解释。

二. 实现

TerminalExpression: 终结符表达式,每个终结符都需要一个 TerminalExpression。
NonterminalExpression:非终结符表达式,实现文法中与非终结符有关的解释操作。
Context: 上下文,包含解释器之外的一些全局信息。

案例:以下是一个规则检验器实现,具有 and 和 or 规则,通过规则可以构建一颗解析树,用来检验一个文本是否满足解析树定义的规则。
例如一颗解析树为 D And (A Or (B C)),文本 "D A" 满足该解析树定义的规则。
这里的 Context 指的是 String。

public abstract class Expression {
    public abstract boolean interpret(String str);
}
public class TerminalExpression extends Expression {
    private String literal = null;

    public TerminalExpression(String str) {
        literal = str;
    }

    public boolean interpret(String str) {
        StringTokenizer st = new StringTokenizer(str);
        while (st.hasMoreTokens()) {
            String test = st.nextToken();
            if (test.equals(literal)) {
                return true;
            }
        }
        return false;
    }
}
public class AndExpression extends Expression {
    private Expression expression1 = null;
    private Expression expression2 = null;

    public AndExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String str) {
        return expression1.interpret(str) && expression2.interpret(str);
    }
}
public class OrExpression extends Expression {
    private Expression expression1 = null;
    private Expression expression2 = null;

    public OrExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String str) {
        return expression1.interpret(str) || expression2.interpret(str);
    }
}
public class Client {
    /**
     * 构建解析树
     */
    public static Expression buildInterpreterTree() {
        // Literal
        Expression terminal1 = new TerminalExpression("A");
        Expression terminal2 = new TerminalExpression("B");
        Expression terminal3 = new TerminalExpression("C");
        Expression terminal4 = new TerminalExpression("D");
        // B C
        Expression alternation1 = new OrExpression(terminal2, terminal3);
        // A Or (B C)
        Expression alternation2 = new OrExpression(terminal1, alternation1);
        // D And (A Or (B C))
        return new AndExpression(terminal4, alternation2);
    }

    public static void main(String[] args) {
        Expression define = buildInterpreterTree();
        String context1 = "D A";
        String context2 = "A B";
        System.out.println(define.interpret(context1));
        System.out.println(define.interpret(context2));
    }
}
true
false

三. 优缺点

优点:
1. 由于语法由很多类表示,所以,当语法规则或者扩展语法时,只需要修改或者扩展表达式即可。
2. 对于简单的文法应当比较简单且易于实现,过于复杂的语法并不适合解释器模式。
缺点:
1.由于语法由很多类表示,过于复杂时,会产生大量的解释类,引起类臃肿,增加系统维护的难度。
2. 解释器模式采用递归调用方法,当完整表达式层级较深时,解释效率会下降。

JDK中的解释器模式
java.util.Pattern
java.text.Normalizer
javax.el.ELResolver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1073147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis 事物

Redis事务 一个队列中,一次性、顺序性、排他性的执行一系列命令 正常执行 放弃事务 在exec执行之前,报错,则所有命令都不会执行 在exec执行后,报错,则其它正确的指令会执行,错误的命令会抛弃 watch 监…

一文搞懂二叉树先序遍历的三种方法

系列文章: 相关题目: 144. 二叉树的前序遍历 先序遍历结果为:1 2 4 5 3 6 7 总体上分为两种框架,递归框架和非递归框架,递归框架又分为两种思路:分解思路和遍历思路。 递归 1、分解思路 【分解为子问题】…

OLED透明拼接屏在乌海湖旅游区的应用探究

作为一名资深的OLED透明拼接屏工程师,我希望通过这篇文章来介绍一下OLED透明拼接屏在乌海这座城市中的表现,并对该城市的历史、景点、管辖范围进行简要介绍。 最后,我将讨论OLED透明拼接屏在乌海适用的行业和领域,并列举一些优缺…

在windows7中运行pycharm报错误“无法定位程序输入点 CreateAppContainerProfile 于动态链接库 USERENV.dll 上

截图: 解决办法: 一时不知道怎么办。一想之前是好好的,不知道被什么破坏了。所以恢复系统解决。

Prometheus集成consul[被监控对象开启basic认证]

1,被监控对象开启basic认证 具体操作这里不再详细细讲。 2,将被监控对象注册到consul 由于被监控对象开启了basic认证,注册到consul后显示:401 Unauthorized Output: Unauthorized,不能够正常健康检查。 3&#xff0c…

找不到d3dx9_35.dll,无法继续执行代码解决方法

今天,我要和大家分享:d3dx9_35.dll丢失怎么解决。 首先,我们需要了解什么是d3dx9_35.dll文件。d3dx9_35.dll是一个动态链接库文件,它是DirectX 9中的一个重要组件,通常被用于游戏和多媒体软件中。如果我们的电脑中缺少…

功能测试复习

一。测试流程 1.需求评审 确保各部门需求理解一致 2.计划编写 测什么,谁来测,怎么测 3.用例设计 验证项目是否符合需求的操作文档 4.用例执行 项目模块开发完成开始执行用例文档实施测试 5.缺陷管理 对缺陷进行…

图片上传并映射回显

目录 简介 代码展示 1、配置图片保存地址 2、拦截器配置映射地址 3、接口 简介 我们知道文件的上传就是把本地的文件上传到服务器上(在服务器中指定地址保存);通过访问服务器地址去查看文件;但是直接通过域名和保存地址是无…

【单片机】17-温度传感器DS18B20

1.DS18B20相关背景知识 1.温度传感器 (1)测温度的方式:物理(汞柱,气压),电子(金属电性能随温度变化) (2)早期:热敏电阻(模…

青岛建筑模板厂家有哪些?

在青岛地区,有许多建筑模板厂家供应各类建筑模板材料。其中,一家备受认可的建筑模板厂家是广西贵港市的能强优品木业公司。该公司具备全面的生产能力和优质的产品质量,在青岛地区的建筑施工企业中有着广泛的合作经验。 能强优品木业公司提供全…

【密评】商用密码应用安全性评估从业人员考核题库(八)

商用密码应用安全性评估从业人员考核题库(八) 国密局给的参考题库5000道只是基础题,后续更新完5000还会继续更其他高质量题库,持续学习,共同进步。 1751 判断题 根据GM/T0016《智能密码钥匙密码应用接口规范》&#x…

【Vue面试题十二】、说说你对双向绑定的理解?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:双向数据绑定是什么 一、…

VMware Workstation Player 17 下载安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 VMware Workstation Player 17 下载安装教程 虚拟机系列文章前言一、 VMware Workstation Pla…

是炒作还是大势所趋?电商企业7 种日渐盛行的 API 管理应用场景

17 世纪兴起的纸质货币改变了全球经济的面貌,开创了国际货币监管的新时代。货币能带来如此重大的颠覆,主要原因在于它有着标准化“交换媒介”的能力。在技术和数字化世界中,API 产生了类似的效果,它创建了标准化、可重复使用、安全…

CSS 中::after的妙用(实现在margin中显示内容)

效果图如下: 背景: 如上图,之前只是当纯的写一个参考货架平面图,用作物料系统的在库状态可视化,当完成页面body分成10等份时,货架之间需要有通道,为了实现实际的样式,我给每个等份都…

FPGA实现电机霍尔编码器模块

一. 简介 想要知道直流电机的转速,就需要用到编码器,常用的编码器有霍尔和光电两种,但是光电编码器比较贵(性能好于霍尔),所以平常的时候使用最多的是霍尔编码器了。 霍尔编码器一般有AB两相信号输出,默认的时候为低…

AB试验(五)实验过程中的一些答疑解惑

AB试验(五)实验过程中的一些答疑解惑 实验结果不显著怎么办 出现实验结果不显著的原因 A/B测试的变化确实没有效果,两组指标在事实上是相同的A/B测试的变化有效果,但由于变化的程度很小,测试灵敏度power不足&#x…

Linux 安全 - LSM机制

文章目录 前言一、LSM起源二、LSM简介2.1 MAC2.2 LSM特征 三、Major and Minor LSMs3.1 Major LSMs3.2 Minor LSMs3.3 BPF LSM 四、LSM 框架五、LSM Capabilities Module六、LSM hooks 说明参考资料 前言 在这两篇文章中介绍了 Linux 安全机制 Credentials : Linu…

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题 在实际开发中,经常会遇到引脚资源受限需要将一些具有特定功能的引脚配置为普通引脚或其他引脚功能使用的情况。 博主之前遇到过类似的情况,都正常解决了。但偶尔也会出现在配置引脚时少了一些配…

Go语言基础学习教程(一)导学部分

Go语言基础 将在工作中学习的东西整理出来作为一个简单的Go语言基础教程 Go语言 Go语言(Golang)是Google公司2009年推出的一门"高级编程言语", 目的是为了解决: "现有主流编程语言"明显落后于硬件发展速度的问题不能合理利用多核CPU的优势提升软件系统性…