java23种设计模式(二十三) -- 解释器模式(行为设计模式)

JAVA设计模式总结之23种设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。 阅读详情

解释器模式

简介

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

解释器模式是指给定一个使用规定格式和语法的语言,并且建立一个解释器来解释该语言中的句子。解释器本身就是一种按照规定的语法进行解析的方案,但是总体来说也是一种使用频率相对较低但学习难度较大的设计模式。

结构

  1. 抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
  2. 终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
  3. 非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。
  4. 环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

代码实现

项目结构

在这里插入图片描述
Expression接口

/**
 * 表达式的统一定义.
 */
public interface Expression {
 
    int interpret();
 
    @Override
    String toString();
}

表达式

/**
 * 加号
 */
public class PlusExpression implements Expression {
 
    private Expression leftExpression;
    private Expression rightExpression;
 
    public PlusExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
 
    @Override
    public int interpret() {
        return leftExpression.interpret() + rightExpression.interpret();
    }
 
    @Override
    public String toString() {
        return "+";
    }
}

/**
 * 减号
 */
public class MinusExpression implements Expression {
 
    private Expression leftExpression;
    private Expression rightExpression;
 
    public MinusExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
 
    @Override
    public int interpret() {
        return leftExpression.interpret() - rightExpression.interpret();
    }
 
    @Override
    public String toString() {
        return "-";
    }
 
}

/**
 * 乘号
 */
public class MultiplyExpression implements Expression {
 
    private Expression leftExpression;
    private Expression rightExpression;
 
    public MultiplyExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
 
    @Override
    public int interpret() {
        return leftExpression.interpret() * rightExpression.interpret();
    }
 
    @Override
    public String toString() {
        return "*";
    }
 
}

/**
 * 数字
 */
public class NumberExpression implements Expression {
 
    private int number;
 
    public NumberExpression(int number) {
        this.number = number;
    }
 
    public NumberExpression(String s) {
        this.number = Integer.parseInt(s);
    }
 
    @Override
    public int interpret() {
        return number;
    }
 
    @Override
    public String toString() {
        return "number";
    }
}

测试类

public class ApiTest {

    @Test
    public void testCommand(){
        String tokenString = "4 3 2 - 1 + *";
        Stack<Expression> stack = new Stack<>();

        String[] tokenList = tokenString.split(" ");
        for (String s : tokenList) {
            if (isOperator(s)) {
                Expression rightExpression = stack.pop();
                Expression leftExpression = stack.pop();
                System.out.printf("popped from stack left: %s right: %s\n",
                        leftExpression.interpret(), rightExpression.interpret());
                Expression operator = getOperatorInstance(s, leftExpression, rightExpression);
                System.out.printf("operator: %s\n", operator);
                int result = operator.interpret();
                NumberExpression resultExpression = new NumberExpression(result);
                stack.push(resultExpression);
                System.out.printf("push result to stack: %s\n", resultExpression.interpret());
            } else {
                Expression i = new NumberExpression(s);
                stack.push(i);
                System.out.printf("push to stack: %s\n", i.interpret());
            }
        }
        System.out.printf("result: %s\n", stack.pop().interpret());
    }

    private static boolean isOperator(String s) {
        return s.equals("+") || s.equals("-") || s.equals("*");
    }

    private static Expression getOperatorInstance(String s, Expression left, Expression right) {
        switch (s) {
            case "+":
                return new PlusExpression(left, right);
            case "-":
                return new MinusExpression(left, right);
            case "*":
                return new MultiplyExpression(left, right);
            default:
                return new MultiplyExpression(left, right);
        }
    }
}

在这里插入图片描述

优缺点

优点
  1. 易于改变和扩展文法。因为该模式使用类表示文法,所以可以使用继承改变或扩展该文法。
  2. 每条文法规则都可以是一个类,所以可以很方便的实现一个简单的语言。
  3. 易于实现文法的定义。在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂,还可以通过一些工具自动生成节点类代码。
  4. 增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类,原有表达式类代码无须修改,符合“开闭原则”。
缺点
  1. 对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。
  2. 执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦。

适用场景

  1. 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  2. 一些重复出现的问题可以用一种简单的语言来进行表达。
  3. 一个语言的文法较为简单。
  4. 执行效率不是关键问题。【注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。】
23种设计模式【Java】全案例解析 具体解析 创建型 结构型 7个原则 单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】: 一个类负责一项职责。 里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】: 继承与派生的规则。 依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。 接口隔离原则【INTERFACE SEGREGATION PRINC 阅读详情

相关推荐

【愚公系列】二十三种设计模式(十五)-解释器模式(Interpreter Pattern)

设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。

愚公智库 47万+

Java 之 23 种设计模式解析——23、解释器模式(Interpreter)

23、解释器模式(Interpreter) 解释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄。   Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下: 1. public interface Expression { 2. public int interpret(Context context); 3...

毕富国的博客 648

求一个点到任意两个点所在直线距离 C#代码公式

求点C(X0,Y0) 到点A(x1,y1)和点B(x2,y2)所在直线的距离 1.已知任意两个点,求这两个点所在直线 已知点A(x1,y1),点B(x2,y2) 设直线上另外任意一个点为(x,y) 那么 (x-x1)/(y-y1) = (x2-x1)/(y2-y1); 整理后得方程: (y2-y1)x + (x1-x2)y + (y1-...

qq_29434987的博客 4491

Java中23种设计模式的详细介绍

Java开发中23种设计模式详细介绍设计模式介绍设计模式分类设计模式六大原则开闭原则(Open Close Principle)里氏代换原则 设计模式介绍 设计模式(Design Patterns): 一套被反复使用,多数人知晓,经过分类编目,代码设计的总结 使用设计模式是为了可重用代码,让代码更容易理解,保证代码可靠性 项目中合理运用设计模式可以完美的解决很多问题,每种模式都有相应的原理...

攻城狮Chova的博客 1万+

广义平均(Generalized Mean, GeM)

本位介绍了广义平均操作的定义和简要推导,帮助大家理解其含义。

qq_45802280的博客 4547

【FPGA】DDR3调试总结

DDR3管脚根据不同的功能可以分为:数据组、地址组、控制组和电源组。如图上所示,共96个管脚。

m0_51679724的博客 4965

Java二十三种设计模式-解释器模式(23/23)

解释器模式是一种行为设计模式,用于评估语言的文法表示。它特别适用于需要解释执行简单语言或表达式的情况。基础知识,java设计模式总体来说设计模式分为三大类:(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

小相探索IT世界 1825

3DMax高效建模与人工智能:一场颠覆传统创作的效率革命

AI与3DMax的结合,不仅是工具效率的升级,更是一场创作范式的革命。从“手动雕刻”到“智能共生”,设计师的角色正从执行者转向决策者。正如网友所言:“AI不是替代人类,而是赋予凡人以神笔。”在这场变革中,唯有拥抱技术、深耕创意,方能在数字艺术的浪潮中立于潮头。参考文献与工具推荐技术原理:火星时代资讯《人工智能和三维建模》工具实测:哔哩哔哩《tyDiffusion 3dsMax应用》9、Tripo AI官网教育案例:原创论文《人工智能技术介入三维动画课程建设》

m0_46478534的博客 3009

瑞_23种设计模式_解释器模式

本文章为瑞_系列专栏之《23种设计模式》的解释器模式篇。解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。解释器模式属于:类行为模式

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 1777

比亚迪唐/秦开发者必看:253个车辆接口实战指南(附常用功能调用示例)

本文为比亚迪唐/秦开发者提供了一份详尽的车辆接口实战指南。文章聚焦于比亚迪开放的253个车辆接口,从开发环境搭建、核心状态监控到高频控制功能(如空调与充电管理),结合真实代码示例,帮助开发者快速上手并规避常见问题,高效开发车载应用。

weixin_28327051的博客 605

AI驱动的客户终身价值分析:深入理解公司的收入质量

客户终身价值(Customer Lifetime Value, CLV)是衡量客户在整个生命周期内能为企业带来多少利润的重要指标。传统的CLV计算方法往往过于简化,无法准确反映复杂的客户行为和收入模式。本文旨在介绍如何利用人工智能技术,特别是机器学习方法,构建更精确的CLV预测模型,从而帮助企业深入理解其收入质量。CLV的基本概念和商业意义传统CLV计算方法的局限性基于机器学习的CLV预测方法特征工程和模型选择策略实际应用案例和Python实现首先介绍CLV的基本概念和商业背景。

AI云原生与云计算技术学院 477

Java23种设计模式详解

提供了一种方式来封装一组具有相关联的或相互依赖的对象的创建。一个抽象工厂定义了一个接口,用于创建相关或依赖对象的家族,而实际的具体工厂则负责生成具体的对象。下面是一个使用Java实现的抽象工厂模式的简单示例:假设我们有一个图形应用程序,需要绘制不同类型的形状(如圆形、矩形等)和颜色填充策略(如红色、蓝色等)。每种形状都可以有不同的颜色填充,这就构成了两个相关的对象家族。// 抽象产品接口:形状// 具体产品:圆形@Override// 具体产品:矩形@Override。

2301_76508397的博客 3791

mbedtls | 01 - 移植mbedtls库到STM32的两种方法

一、mbedtls 开源库 1. mbedtls是什么 Mbed TLS是一个开源、可移植、易于使用、代码可读性高的SSL库。可实现加密原语,X.509证书操作以及SSL / TLS和 DTLS 协议,它的代码占用空间小,非常适合用于嵌入式系统。 mbedtls遵循 Apache 2.0 开源许可协议,目前由 TrustedFirmware 维护(Linaro主持的一个治理开放社区项目),在Github上已收获 2.6k star,目前Github上发布的最新版本为 2.24.0 版本,开源仓库地址为:

Mculover666的博客(嵌入式) 1万+

Java23种设计模式——23.行为型模式之解释器模式

Java中除去有设计原则之外,还有23中设计模式。 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。 并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。 那我们今天要学习行为型模式中的解释器模式 ! 解释器模式 先来看看什么是解释器模式 通过百科,我们可以看到,啥也没有,这里我给大家说一下啥叫解释器模式,这个模式主要用来做什么的 这个模式主要通过一些相同或者相似的文字,字符,我们将这些字符、文字进行解释,然后来进行操作 ...

胖子胖子大胖子的博客 1057

03. 线性规划与混合整数规划 (LP/MIP)

本文介绍了OR-Tools中的线性规划(LP)和混合整数规划(MIP)求解器。主要内容包括:1) LP/MIP的基本概念和数学形式,对比了LP、MIP、ILP和BIP的区别;2) OR-Tools支持的求解器类型,如GLOP、SCIP等,以及它们各自的特点和适用场景;3) 详细展示了如何使用GLOP求解器进行线性规划求解,包括变量定义、约束添加和目标函数设置;4) 介绍了SCIP求解器的配置和使用方法;5) 讨论了变量类型、约束类型、多目标优化等进阶功能。文章通过Java代码示例演示了如何实现一个完整的优化

智慧是做事用的 156

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

设计模式--解释器模式【行为型模式】

解释器模式(Interpreter Pattern)是一种行为设计模式,解释器模式通过一个解释器对象处理一个语法规则,把复杂的功能分离开,然后选择需要被执行的功能,并把这些功能组合成为需要被解释执行的抽象语法树,再按照抽象语法树来解释执行,实现相应的功能。

weixin_42118323的博客 1179

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

全面解读Java的23种设计模式

需要注意的是,混合使用设计模式要谨慎,不要过度使用设计模式,以免代码过于复杂和难以维护。选择合适的设计模式和合适的组合方式,可以使代码更加简洁、高效和易于维护。

weixin_39158966的博客 3265

精雕软件(JDpaint) 5.5 绿色版

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

设计模式(十六)行为型:解释器模式详解

解释器模式(Interpreter Pattern)是 GoF 23 种设计模式中的行为型模式之一,其核心价值在于为某种特定语言或表达式定义一个语法表示,并提供一个解释器来处理该语法结构。

谦与谦寻的神隐 1079

java23种设计模式-解释器模式

行为型设计模式,给定一个语言,定义其文法的一种表示,并定义一个解释器,用于解释语言中的句子。通过构建语法树来实现特定领域语言的解释执行。

专注后端开发 1036

二十三种设计模式解析

目录 一、设计模式的分类 二、设计模式的六大原则 总原则:开闭原则(Open Close Principle) 1、单一职责原则 2、里氏替换原则(Liskov Substitution Principle) 3、依赖倒转原则(Dependence Inversion Principle) 4、接口隔离原则(Interface Segregation Principle) 5、迪米...

特立独行的程序猿 6324

JAVA 23种设计模式【入门篇】

😹 作者: 爱摸鱼的小凯 😻 爱摸鱼的小凯的博客 😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!

只有登上山顶,才能看到那边的风光 1万+

JAVA的23种设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。

“ 春风若有怜花意,能否许我再少年。” 1132

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

本文介绍了23种经典设计模式之——解释器模式(Interpreter Pattern)的使用及说明

Meteors.的博客 1016

Java的23种设计模式

工厂方法模式中考虑的是一类产品的生产,如电脑厂只生产电脑,电话厂只生产电话,这种工厂只生产同种类的产品,同种类产品称为同等级产品,也就是说,工厂方法模式只考虑生产同等级的产品,但是现实生活中许多工厂都是综合型工厂,能生产多等级(种类)的产品,如上面说的电脑和电话,本质上他们都属于电器,那么他们就能在电器厂里生产出来,而抽象工厂模式就将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,如上图所示纵轴是产品等级,也就是同一类产品;—— From Baidu 百科。

u011074770的专栏 902

java学习视频 java常用23种设计模式

java学习视频主要详细讲解java常用23种设计模式,此套java教程为百度网盘下载! 我曾经花了1万多报过java培训班.可能太过愚钝,感觉白学了。这套java学习视频讲的很好,我培训过,虽说学的很差,但是耳濡目染也算有点基础,写作业的时候没什么思路,但是参考了别人的思路,自己也能写完,写完作业感觉很有成就感。祝大家学有所成!   java学习视频介绍   java常用23...

fengliaoai的博客 1万+

Java开发中的23种设计模式详解

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

退思园 16万+
上一篇: java23种设计模式(二十二) -- 访问者模式(行为设计模式)
下一篇: BIO,NIO,AIO精讲
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值