java设计模式——解释器模式(Interpreter Pattern)

解释器模式 Interpreter —— 让你拥有最终解释权! 给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释文法中的句子。 一、什么是解释器模式? 解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。诸如此类的例子也有很多,比如编译器、正则表达式等等。 如正则表达式,它就是解释器模型的一种应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。 如果一种特定类型的问题发生的. 阅读详情
概述:
      解释器模式是一种使用频率相对较低但学习难度较大的设计模式,它用于描述如何使用面向对象语言构成一个简单的语言解释器。在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则,这些问题的实例将对应为该语言中的句子。此时,可以使用解释器模式来设计这种新的语言。对解释器模式的学习能够加深我们对面向对象思想的理解,并且掌握编程语言中文法规则的解释过程。

定义:
       解释器模式(Interpreter Pattern):定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。解释器模式是一种类行为型模式。

结构:
  • Expression(抽象表达式):在抽象表达式中声明了抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类。
  • TerminalExpression(终结符表达式):终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解释操作,在句子中的每一个终结符都是该类的一个实例。通常在一个解释器模式中只有少数几个终结符表达式类,它们的实例可以通过非终结符表达式组成较为复杂的句子。
  • NonterminalExpression(非终结符表达式):非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作,由于在非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归的方式来完成。
  • Context(环境类):环境类又称为上下文类,它用于存储解释器之外的一些全局信息,通常它临时存储了需要解释的语句。

UML图:



场景:比如计算长方形面积时,有相关的公式进行计算,我们只需要输入对应的参数,对应的结果会由系统计算出来。

代码分析:
/**
 * Created by yangjun on 2016/12/20.
 */

public abstract class Expression {

    /**
     * 解析公式和数值,其中var中的key值是是公式中的参数,value值是具体的数字
     * @param var 该参数相当于Context
     * @return
     */
    public abstract int interpreter(HashMap<String,Integer> var);
}

/**
 * Created by yangjun on 2016/12/20.
 * 终结符类
 */

public class VarExpression extends Expression {
    private String m_key;
    public VarExpression(String key){
        this.m_key = key;
    }

    @Override
    public int interpreter(HashMap<String, Integer> var) {
        return var.get(m_key);
    }
}

/**
 * Created by yangjun on 2016/12/20.
 * 符号类
 */

public abstract class SymbolExpression extends Expression {
    protected Expression m_left;
    protected Expression m_right;
    public SymbolExpression(Expression left,Expression right){
        this.m_left = left;
        this.m_right = right;
    }
}

/**
 * Created by yangjun on 2016/12/20.
 * 乘法解释器(非终结符类)
 */

public class MultiplyExpression extends SymbolExpression {
    public MultiplyExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter(HashMap<String, Integer> var) {
        return super.m_left.interpreter(var) * super.m_right.interpreter(var);
    }
}

/**
 * Created by yangjun on 2016/12/20.
 * 解释器封装类
 */

public class Calculater {

    private Expression expression;

    public void build(String strExp){
        Expression left = null;
        Expression right = null;
        Stack<Expression> stack = new Stack<Expression>();
        char[] chars = strExp.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            switch (chars[i]){
                case '+':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(chars[++i]));
                    stack.push(new AddExpression(left,right));
                    break;
                case '-':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(chars[++i]));
                    stack.push(new SubExpression(left,right));
                    break;
                case '*':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(chars[++i]));
                    stack.push(new MultiplyExpression(left,right));
                    break;
                case '/':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(chars[++i]));
                    stack.push(new DivisionExpression(left,right));
                    break;
                default:
                    stack.push(new VarExpression(String.valueOf(chars[i])));
            }
        }
        this.expression = stack.pop();
    }
    public int compute(HashMap<String, Integer> var){
        return expression.interpreter(var);
    }

}

客户端调用:
    String strExp = "a*b";
    Calculater calculater = new Calculater();
    calculater.build(strExp);
    int compute = calculater.compute(rectangularArea(2,3));
    Log.d("test","compute = "+compute);
}

/**
 * 长方形面积
 * @param lenght
 * @param with
 * @return
 */
public HashMap<String,Integer> rectangularArea(int lenght,int with){
    HashMap<String,Integer> hashMap = new HashMap<String,Integer>();
    hashMap.put("a",lenght);
    hashMap.put("b",with);
    return hashMap;
}

log输出:
12-20 16:21:23.253 20582-20582/? D/test: compute = 6

优点:
  • 易于改变和扩展文法。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
  • 每一条文法规则都可以表示为一个类,因此可以方便地实现一个简单的语言。
  • 实现文法较为容易。在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂,还可以通过一些工具自动生成节点类代码。
  • 增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类,原有表达式类代码无须修改,符合“开闭原则”。

缺点:
  • 对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。
  • 执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦。

适用场景:
  • 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  • 一些重复出现的问题可以用一种简单的语言来进行表达。
  • 一个语言的文法较为简单。
  • 执行效率不是关键问题。【注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。】




【Java设计模式】Java设计模式之(七)解释器模式(Interpreter Pattern) 本文目录 一、解释器模式介绍 二、代码实现 步骤一 步骤二 步骤三 步骤四 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 一、解释器模式介绍 意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。 主要解决:对于一些固定文法构建一个解释句子的解释器。 何时使用:如果一种特定类型的问 阅读详情

相关推荐

RK3588S开发板实战:手把手教你搞定IMX415摄像头驱动配置(附调试日志分析)

本文提供了一份详细的RK3588S开发板配置IMX415摄像头驱动的实战指南。内容涵盖从环境准备、内核驱动编译、设备树节点编写到调试日志分析的完整流程,并重点解析了摄像头调试过程中的常见问题与解决方案,帮助开发者快速完成驱动配置与功能验证。

weixin_28285943的博客 204

Android开发-设计模式-解释器模式(Interpreter)

解释器模式是类的行为模式。给定一个语言之后,解释器模式定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。 # 模式引入

City_Coder的博客 671

[ESP32S3N16R8][LVGL8.3.0][IDF5.2.3]ST7701S RGB屏幕驱动[vscode最详细配置]

ST7701S ESP32S3 基于ESP-IDF5.2.3编写,编程环境为vscode。本教程详细讲述了esp32s3配置st7701s屏幕驱动以及gt911触摸驱动并关联到lvgl8.3.0,使用IDF5.23示例rgb_panel进行测试删除了其里面的屏幕驱动,改为单独编写屏幕和触摸驱动,最后完成了实列。

qq_44022379的博客 2604

android 解释器模式

package com.chenxing.searchjob.sdk.view; import android.util.Log; import java.util.HashMap; import java.util.Map; public class TestClass { private String TAG=IMListView.class.getSimpleName(); ...

一航jason 319

哨兵2植被参数反演避坑指南:SNAP中10m/20m分辨率选择与缺失波段处理

本文深入解析了使用SNAP软件进行哨兵2号植被参数反演时的关键操作与决策。核心在于理解SNAP生物物理处理器NNET10m与NNET20m的架构差异,根据是否需要反演冠层叶绿素含量(Cab)等参数,明智选择10米或20米分辨率工作流。文章详细指导了大气校正、波段重采样及处理L2A数据中B01波段“缺失”等常见问题的解决方案,为生态监测与精准农业应用提供清晰的避坑指南和完整实战流程。

wdx01234567的博客 260

【测试】echo发送和接收TCP/UDP数据包|shell 发送TCP/UDP数据包

目录 通过/dev/tcp、/dev/udp shell给tcp或udp服务发送16进制报文指令 通过/dev/tcp、/dev/udp (https://blog.youkuaiyun.com/u010039418/article/details/86251470) 通过/dev/tcp、/dev/udp可以直接在shell脚本中发起tcp、udp连接,方便又高效,平时用于测试啥的还是挺方便的。 直接发送 格式 /dev/udp/ip/port 比如要向本地10001端口发送数据,可以使用 ec.

我的笔记本 1万+

Android的开发之&java23中设计模式------解释器模式

public class Context { private String input; private String output; public String getInput() { return input; } public void setInput(String input) { this.input = i

〤twinkle╰ つ青春 1319

简要介绍 | 雷达穿墙成像及其应用场景

本文简要介绍了雷达穿墙成像技术的原理、研究现状、挑战与未来展望,希望能为相关领域的研究与应用提供参考。具有广泛的应用前景。本文将详细介绍雷达穿墙成像的原理,以及其在不同应用场景中的实践。逆时偏移算法(Reverse-Time Migration, RTM)雷达穿墙成像技术是一种先进的遥感技术,具有。的能力,可用于探测室内目标。安全与救援、建筑结构检测等领域。雷达穿墙成像技术的核心原理是。是Green函数,表示从接收点。雷达穿墙成像及其应用场景。雷达穿墙成像及其应用场景。目标识别与定位准确性。

NLOS的博客 2232

解释器模式(Interpreter Pattern)

    解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。 类图:   示例: 1、结构 2、java代码 Expression抽象类: package Interpreter.expression; import Interpreter.Cont...

qq_26880671的博客 202

Lammps实现随机粗糙度表面沸腾

Lammps实现随机粗糙度表面沸腾前言 前言

Rockyoung 2702

基于深度学习的柠檬等级检测系统 —— YOLOv8 + UI界面 + 数据集

本项目的目标是构建一个柠檬等级检测系统,通过深度学习模型自动检测柠檬的等级。自动检测柠檬等级:通过图像中的柠檬特征,自动判断其成熟度和质量。实时视频检测:通过摄像头实时监控柠檬的质量等级。用户友好的UI界面:为用户提供简洁直观的操作界面,支持图像上传、实时视频检测等功能。本项目展示了如何基于YOLOv8模型开发一个柠檬等级检测系统,结合PyQt5实现了用户友好的UI界面。通过该系统,用户可以快速上传柠檬图像并自动识别其等级,极大提升了检测效率和准确性。数据集的扩展。

YOLO 1111

Java设计模式——解释器模式【Interpreter Pattern】

Java设计模式、解释器模式、Interpreter Pattern

scorpio的博客 1692

【雕爷学编程】Arduino智慧交通之RF24通信实现车队之间的实时通信和协调

通过这些示例,车队领导可以发送指令给车队成员,车队成员可以接收指令并执行相应的操作,同时车队成员也可以发送自己的位置信息给车队领导或其他成员,以实现车队之间的实时通信和协调。例如,在高速公路上,车队中的车辆可以根据前方车辆的速度和位置信息,自动调整自身的速度和距离,以保持车队的整体稳定和安全。Arduino智慧交通系统利用RF24通信模块实现车队之间的实时通信和协调,通过无线通信技术,车辆之间可以实时传输数据和指令,以实现车队的协同行驶和交通优化。通过数据处理和分析,可以生成实时的交通信息和统计数据。

雕爷学编程 1074

Java设计模式 —— 【行为型模式】解释器模式(Interpreter Pattern)详解

解释器模式(nterpreter Pattern)是指给定一个语言/表达式/语法规则,定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式),是一种行为模式。在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。

知唔猪的博客 691

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java设计模式---解释器模式(Interpreter pattern)

java设计模式—解释器模式(Interpreter pattern) 1. 概述 解释器模式是一种使用频率相对较低但学习难度较大的设计模式,它用于描述如何使用面向对象语言构成一个简单的语言解释器。在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则,这些问题的实例将对应为该语言中的句子。此时,可以使用解释器模式来设计这种新的语...

渔潭的博客 351

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 解释器模式(Interpreter) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 解释器模式(Interpreter) 语言解释器,用预先定义的文法解释语言。一般主要应用在编译器的开发中,因此适用面很窄。一、说明: 1、Context 环境类; 2、IExpression 表达式(接口); 3、Plus 表达式(实现类)。二、Java实现,代码如下: 1、Context

Z 320

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java设计模式】· 解释器模式(Interpreter Pattern)

1. 当我们解决问题时,需要重复多次使用某个方法,为了方便,我们就会专门为这个方法写一个类,这就是解释器模式。 2.解释器模式 和 享元模式的不同在哪儿? 两个模式共同点是解决"重复多次调用"的问题,享元模式是解决元素多次使用的问题,它的作用是解决这类问题的同时还节省了内存空间。 解释器模式是解决方法多次使用的问题,它作用是让我们在解决问题时不需要写太多的代码。

早起早睡的少年郎 793

Java设计模式之解释器模式(Interpreter Pattern)

Java设计模式之解释器模式(Interpreter Pattern)

慕白Lee的博客 505

java 23 种设计模式-16-java 解释器模式(Interpreter Pattern)

目录 目录 解释器模式 实际案例 定义 测试 实现方式 UML &amp; Code UML Code 系列导航 解释器模式 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 实际案例 类信息概览: ...

3万+

JAVA设计模式第七章:解释器模式(Interpreter Pattern)

解释器模式 解释器模式属于行为型模式 是按照一定的语义进行解释的方案,在日常编码中使用较少 在java中expression4J spring的SpEL表达式 代码实现 用解释器模式实现对一个简单的加减法计算的解析 Context 解释器上下文 Expression 解释器接口 非终结符表达式: 通常由其它表达式组成; 终结符表达式: 一般为取值表达式,为递归树的叶子节点 /** * 上下文 * * @author cans * @date 2022/5/14 **/ public clas

Asparrow的博客 322

java设计模式(二三)解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern)的模式介绍、场景说明、优缺点展示以及代码示例讲解。

weixin_70044963的博客 365

Java设计模式--解释器模式【Interpreter Pattern】

其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中;在实际应用中,我们可能很少碰到去构造一个语言的文法的情况。虽然你几乎用不到这个模式,但是看一看还是能受到一定的启发的。    解释器模式是类的行为模式,给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

CoderLover 356

(17)Java设计模式 - 解释器模式(Interpreter Pattern)

解释器模式 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 介绍 意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。主要解决:对于一些固定文法构建一个解释句子的解释器。何时使用:如果一...

潘建南的博客 1788

重走Java设计模式——解释器模式(Interpreter Pattern)

解释器模式 定义 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 代码示例 我们将创建一个接口 Expression 和实现了 Expression 接口的实体类。定义作为上下文中主要解释器的 TerminalExpression ...

裕博的博客 251

【Java教程】Day20-15 设计模式:行为型模式——解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义语言的文法表示,并设计一个解释器来解析和执行该语言中的句子。它是一种特定场景下的解决方案,常用于需要解析和解释用户输入的复杂规则或语言的场合。

max202011161630的博客 643
上一篇: java设计模式——迭代器模式(Iterator Pattern)
下一篇: 解决Ubuntu网络连接问题
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值