行为模式之解释器模式 示例

解释器模式例子 实现了以解释机器人指令为例,实现解释器模式 立即下载

今天复习设计模式看到解释器模式。想到之前我碰到过的一个问题。

问题:前后端多条件的解析。
例:某字符串token开始于“a” 且包含“b” 或长度等于10

之前是通过三方的组件解决的。如果要自己实现一个可扩展、易交互的方案。之前没想到什么好办法。

其实可以用解释器模式封装两层来解决。

但我的解释器示例以另一个更简单的例子做一个举例。上面的仅是一个思考。

问题:波兰表示法。运算符末尾添加操作数的方式
例:1 2 + 代表1+2的运算。 3 4 + 5 - 6 + 代表3+4-5+6的运算

解释器一般有几部分组成。

1、Context(环境):封装解释器的全局信息,所有具体的解释器都需访问Context.

2、AbstractExpression(抽象表达式):一个抽象类或接口。声明执行的解释方法,由所有具体的解释器实现。

3、TerminalExpression(终结符表达式)。一种解释器类,实现与语法终结符相关的操作。终结符表达式必须被实现或示例化,因为它表示表达式的结尾

4、NonTerminalExpression(非终结符表达式):实现语法的不同规则或符号的类。每一个语法都应该创建一个类。

实现代码示例:

1、表达式接口:

/**
 * 表达式接口
 */
public interface Expression {

    public float interpret();
}

2、终结符表达式。(在本例中为数值)

/**
 * 数值表达式
 */
public class NumberExpression implements Expression{


    private float number;

    public NumberExpression(float number){
        this.number = number;
    }

    @Override
    public float interpret() {
        return number;
    }
}

3、非终结符表达式。本例中以加法、减法两个规则为例

/**
 * 操作符解释器:加法
 */
public class PlusExpression implements Expression{


    Expression left;
    Expression right;
    public PlusExpression(Expression left, Expression right){

        this.left = left;
        this.right = right;
    }
    @Override
    public float interpret() {
        return this.left.interpret() + this.right.interpret();
    }
}
/**
 * 操作符解释器:减法
 */
public class MinusExpression implements Expression{


    Expression left;
    Expression right;
    public MinusExpression(Expression left, Expression right){

        this.left = left;
        this.right = right;
    }
    @Override
    public float interpret() {
        return this.left.interpret() - this.right.interpret();
    }
}

4、写一段代码通过建立好的类来实现语法树。

/**
 * 通过解释器类实现语法树
 */
public class Evaluator {

    public float evaluator(String expression){

        Stack<Expression> stack = new Stack<>();
        float result = 0;
        for (String token : expression.split(" ")){

            if(isOperator(token)){
                Expression exp = null;
                if(token.equals("+")){
                   exp = stack.push(new PlusExpression(stack.pop(), stack.pop()));
                }else if(token.equals("-")){
                   exp = stack.push(new MinusExpression(stack.pop(),stack.pop()));
                }

                if(exp != null){
                    result = exp.interpret();
                    stack.push(new NumberExpression(result));
                }
            }

            if(isNumber(token)){
                stack.push(new NumberExpression(Float.parseFloat(token)));
            }
        }
        return result;
    }

    private boolean isOperator(String token){
        if(token.equals("+") || token.equals("-"))
            return true;
        return false;
    }

    private boolean isNumber(String token){
        try {
            float v = Float.parseFloat(token);
            return true;
        }catch (Exception e){
            return false;
        }
    }

    public static void main(String[] args) {

        Evaluator evaluator = new Evaluator();
        System.out.println(evaluator.evaluator("2 3 +"));
        System.out.println(evaluator.evaluator("2 3 + 5 - 6 +"));
    }
}

一个简单的解释器模式代码完成了。

libiec61850实战:手把手教你用C语言动态获取IED设备模型(附完整代码解析) 本文详细介绍了如何使用libiec61850库通过C语言动态获取IED设备模型,包括环境配置、连接建立、模型遍历及错误处理等关键步骤。通过完整的代码示例和实战案例,帮助开发者掌握智能变电站通信中的核心技术,提升工业自动化系统的开发效率。 阅读详情

相关推荐

科研效率革命:Zotero与Web of Science联动实现千篇文献一键获取

本文详细介绍了如何利用Zotero与Web of Science联动实现科研文献的高效管理,包括批量导入、智能下载和自动整理千篇文献的技巧。通过精准检索、RIS文件导出和Zotero插件设置,科研人员可以大幅提升文献获取和管理的效率,特别适合开题报告和综述写作等场景。

weixin_29219539的博客 253

jeval自带函数简单实现

上篇博客我大概说了jeval是啥,有啥优点,为啥选择他之类的问题,这篇我简单说一下jeval内置函数吧,知道是啥,然后会简单的使用,下篇博客我介绍一下jeval实现自定义函数。 闲言少叙,上代码 <!-- https://mvnrepository.com/artifact/net.sourceforge.jeval/jeval --> <dependency> ...

wlyang666的博客 888

qcom bypass node介绍

介绍qcom bypass node,以及如何让其生效

haodada1226的博客 2042

设计模式——解释器模式(附代码示例)

一. 传统方式 以实现四则运算为例,如先输入表达式a+b-c,再输入a,b,c的值,最后求结果 1. 传统方式解决 编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果 2. 传统方式问题分析 如果加入新的运算符,不利于扩展,另外让一个方法来解析会造成程序结构混乱,不够清晰。故引出解释器模式。 二. 解释器模式 1. 概念 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析...

枫陵的博客 865

全国充电站分布数据

CnOpenData推出的充电站数据覆盖全国34个省份的3万条数据,包含充电站名称、省份名称、省份代码、商圈、经纬度等地理信息以及商业类型、评分、消费等衍生信息,能为城市规划、环境科学、市场分析、技术发展和社会经济研究等多个领域提供宝贵的数据支持。

Sunny9qx的博客 4025

山东大学软件学院计算机组成原理课程设计实验三

文章目录一、实验时间二、实验内容1. 实验目的2. 设计要求3. 实验基本思路三、电路图1. 可预置初值的模256异步计数器2. 8位ALU电路3. 总图四、补充 一、实验时间 第三次实验:2021年4月8日星期四,第六周 第一次部件级实验,开始算分 二、实验内容 微程序控制的运算器设计 1. 实验目的 (1)熟悉简单运算器的结构 (2)熟悉微命令的产生和时序 (3)熟悉运算器功能测试。 2. 设计要求 利用之前设计的具有超前进位功能的8位ALU,实现简单算术或逻辑运算 两操作数由八位寄存器R0、R1提供,

叶卡捷琳堡的博客 1万+

【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解解释器模式的思想,介绍其常见的应用场景,举例说明其实现方式

我只管埋头前行,剩下的交给时间。 2797

【图像增强】论文精读:Correlation Matching Transformation Transformers for UHD Image Restoration(UHDformer)

论文题目:Correlation Matching Transformation Transformers for UHD Image Restoration —— 用于UHD图像恢复的相关匹配变换变压器AAAI 2024!本文提出了一种用于超高清(UHD)图像恢复的通用变压器UHDformer。UHDformer包含两个学习空间:(a) 高分辨率空间中的学习,(b)低分辨率空间中的学习。前者学习多层次的高分辨率特征,融合低层特征,重建残差图像,后者从高分辨率特征中学习更多的代表性特征,以促进更好的恢复。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 290

设计模式之-解释器模式,快速掌握解释器模式,通俗易懂的讲解解释器模式以及它的使用场景

总结来说,解释器模式适用于需要解析和执行简单语法规则的场景,并且提供了一种灵活、可扩展的方式来处理复杂的表达式。通过将问题表示为语言规则。

咖啡程序员 1692

数字 IC 笔试面试必考点(1)FPGA 芯片架构

FPGA 芯片架构是非常重要的,如果你不了解 FPGA 芯片内部的详细架构,那么...

新芯设计的博客 2808

Open3D——平面点云凸多边形轮廓提取【2025最新版】

平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 6753

设计模式之解释器模式详解及实例

我们实现了三个具体的表达式类:AddExpression(用于表示加法表达式),SubtractExpression(用于表示减法表达式)和NumberExpression(用于表示数字)。非终结符表达式(Non-Terminal Expression):实现抽象表达式接口的具体类,用于解释非终结符表达式。易于扩展:当需要增加新的文法规则时,只需增加新的非终结符表达式类,无需修改原有代码,符合开闭原则。易于维护:每个文法规则对应一个非终结符表达式类,当需要修改或维护某个规则时,只需修改对应的类即可。

huanxiajioabu的博客 946

AI系统架构原理与代码实战案例讲解

人工智能的概念可以追溯到上世纪50年代,图灵测试的提出标志着人工智能作为一门学科的诞生。早期的研究主要集中在符号推理、专家系统等领域,取得了一些突破,例如机器定理证明、西洋跳棋程序等。上世纪80年代,随着专家系统的兴起,人工智能进入了一个黄金时期。专家系统通过模拟人类专家的知识和经验进行推理和决策,在医疗诊断、故障诊断等领域取得了成功应用。进入90年代,由于计算能力的限制和数据量的不足,人工智能的发展陷入低谷。近年来,随着深度学习技术的突破、大数据的兴起以及计算能力的提升,人工智能迎来了第三次发展浪潮,在图

AI天才研究院 1794

北风设计模式课程---19、解释器模式

北风设计模式课程---19、解释器模式 一、总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装备工厂先生产出来装备,然后给宗门武器库,宗门武器库发给我,如果是打怪获得的装备,可以是装备工厂把装备给的怪物装备库 1、什么是解释器模式? 简单的语法解释器构架:Interpreter模式是一种简...

weixin_34247155的博客 135

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

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

折腾Java设计模式之解释器模式

解释器模式 解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。 意图 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。 主要解决 对于一些固定文法构建一个解释句子的解释器。 何时使用 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个...

weixin_30881367的博客 63

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

《JAVA与模式》之解释器模式(转)

在阎宏博士的《JAVA与模式》一书中开头是这样描述解释器(Interpreter)模式的:   解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。 解释器模式的结构   下面就以一个示意性的系统为例,讨论解释器模式的结构。系统的结构图如下所示:   模式所涉及的角色如下所示:...

76

Camera2Demo

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

Java解释器模式`

解释器模式提供了一种评估计算语言语法或表达式的方法。 这种类型的模式属于行为模式。 这种模式涉及实现一个表达式接口,它告诉解释一个指定的上下文。 此模式用于SQL解析,符号处理引擎等。 实现示例 我们将创建一个接口Expression并且在具体的类实现这个Expression接口。 定义了一个TerminalExpression类,用作所讨论的上下文的主解释器。 其他的类 -OrExpres...

weixin_30477293的博客 65

设计模式--解释器模式

简介 解释器模式基本介绍 1)在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过词法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。 2)解释器模式(Interpreter Pattern):是一种行为模式,指给定一个语言表达式,定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式) 角色 抽象表达式角色(Expression):声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是

CodersCoder的博客 164

设计模式行为模式_行为设计模式:解释器

设计模式行为模式 以前,我们研究了责任链和命令模式。 他们确实解决了不同的问题,但是他们都将一个动作委派给另一个组件,命令模式总是委派该动作,如果无法处理该动作,则责任链会将其转发给其后继者。 我们将切换上下文并检查解释器模式。 解释器模式指定如何评估自定义语言。 示例是无限的,例如spring的拼写语言,甚至是类似sql的语言。 我们将使事情保持简单,并仅使用select和where...

danpu0978的博客 69

设计模式—解释器模式详解《二》

解释器模式是类的行为模式,给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器,客户端可以使用这个解释器来解释这个语言中的句子。为了加深对于解释器模式的理解,大家可以先看我的第一篇设计模式—解释器模式详解《一》 意图 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。 用途 对于一些固定文法构建一个解释句子的解释器。 何时使用 如果一...

心相印的专栏 277

解释器模式,女朋友给男朋友的一个机会!

​ **请注意!请注意!!!**今天讲给大家讲解非常“有用”的设计模式,解释器模式!!! ​ 设计模式有三大种类,一种是创建型模式,一种是结构型模式,最后一种是行为性模式,那么解释器模式属于哪一种呢?带领大家一起来了解学习解释器模式! ​ 本次介绍围绕着以下五点展开。什么是解释器模式?用来做什么?怎么做?有哪些优点?有哪些不足? ​ 解释器模式顾名思义,就是用来定义和解释。 ​ 给定一种特定语言,这个语言有特定的文法,解释器可以解释这个语言中的句子含义。即解释器提供一种语言,如java,同时它也提供一种手段

KnightHONG的博客 357

JAVA23种设计模式之解释器模式

解释器模式 解释器模式是类的行为模式,给定一个语言,定义他的文法表示,并且定义一个解释器,客户端可以使用这个解释器来解释这个语言中的句子。一般在现实应用中使用的比较少,毕竟相对来说,我们一般不需要自己定义一套自己的语法来解析。其实相对来说,解释器就相当于大脑,把一句话翻译成可以理解的内容。 解释器模式的示例图 解释器模式包含的角色 抽象表达式角色:声明一个所有具体表达式角色都需要实现或者继...

CoderJu的博客 211

解释器模式(Interpreter) Java实现

解释器模式 解释器模式(Interpreter)的定义 解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。 解释器模式的结构 下面就以一个示意性的系统为例,讨论解释器模式的结构。系统的结构图如下所示: 模式所涉及的角色如下所示: (1)抽象表达式(Expression)角色:声明一个所有的具体表...

CmdSmith的博客 823

解释器(Interpreter)模式

[size=large] 解释器模式是一种行为模式,比较通用的定义“给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子”。spring的express中就使用了这种设计模式。 解释器模式的本质就是解释自定义了的语言,其中涉及三个概念:表达式(Expression)、解释器(Interpreter)和环境...

iteye_10988的博客 232

JAVA设计模式-解释器模式

解释器模式可以将一个语言的句子抽象成语法树的形式,通过递归的方式来解析语法,适合一些复杂问题,可扩展性良好。我这里的语法设计的并不好,后续在实际开发中如果需要使用解释器模式需要对语法树进行设计。

weixin_48886954的博客 144
上一篇: git快速下载地址
下一篇: Spark复习(一)电光火石间体验Spark2.x开发
MrBack
博客等级 码龄9年 27粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值