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

基于Android13的系统启动流程分析(三)之FirstStageMain阶段 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init1. Bootloader 引导当按下设备电源键时,最先运行的就是 bootloader(固化在ROM的程序),bootloader 的主要作用就是硬件设备(如 CPU、flash、内存)的初始化并加载到RAM,通过建立内存空间映射,为装载 Linux 内核做好准备,。 阅读详情
  1. 解释器模式
    解释器模式是类的行为模式,给定一个语言,定义他的文法表示,并且定义一个解释器,客户端可以使用这个解释器来解释这个语言中的句子。一般在现实应用中使用的比较少,毕竟相对来说,我们一般不需要自己定义一套自己的语法来解析。其实相对来说,解释器就相当于大脑,把一句话翻译成可以理解的内容。
  2. 解释器模式的示例图
    解释器模式示意图
  3. 解释器模式包含的角色
  • 抽象表达式角色:声明一个所有具体表达式角色都需要实现或者继承的抽象接口。该接口最主要的是一个interpret()方法,一般称为解释操作。
  • 终结符表达式角色:实现了抽象表达式角色所要求的接口,主要是interpret()方法。文法中的每个终结符都有一个具体的终结表达式与之对应,比如一个简单的加法运算a=b+c;在这里面b和c都是终结符,对应的解释b和c的解释器就是终结符表达式。
  • 非终结符表达式角色:文法中每一个规则都需要一个具体的非终结符表达式,一般表示文法中的运算符或者其他关键字,上面的加法运算中"+“就是非终结符。解析”+"的解释器就是一个非终结符表达式。
  • 环境角色:这个角色的任务一般是用来存放文法中各个终结符对应的具体值,比如b,c,我们可以给b赋值100,c赋值为200,这些就需要存放到环境角色中,很多情况下我们使用Map来充当环境角色。
  1. 示例代码:(示例代码引用自《JAVA设计模式(22):行为型-解释器模式(Interpreter)》)
  • 环境角色:
public class Context {
    /**
     * 用于将字符串分解为更小的字符串标记(Token),默认情况下以空格作为分隔符
     */
    private StringTokenizer stringTokenizer;
    /**
     * 当前字符串标记
     */
    private String currentToken;

    public Context(String text) {
        stringTokenizer = new StringTokenizer(text);
        nextToken();
    }

    /**
     * 返回下一个标记
     * @return
     */
    public String nextToken() {
        if (stringTokenizer.hasMoreTokens()){
            currentToken = stringTokenizer.nextToken();
        }else {
            currentToken = null;
        }
        return currentToken;
    }

    /**
     * 返回当前的标记
     * @return
     */
    public String currentToken() {
        return currentToken;
    }

    /**
     * 跳过一个标记
     * @param token
     */
    public void skipToken(String token){
        if (!token.equals(currentToken)) {
            System.err.println("错误提示:" + currentToken + "解释错误!");
        }
        nextToken();
    }

    /**
     * 如果当前的标记是一个数字,则返回对应的数值
     * @return
     */
    public int currentNumber(){
        int number = 0;
        try{
            number = Integer.parseInt(currentToken); //将字符串转换为整数
        }catch(NumberFormatException e) {
            System.err.println("错误提示:" + e);
        }
        return number;
    }
}
  • 抽象表达式角色:
public abstract class Expression {
    /**
     * 声明一个方法用于解释语句
     * @param text
     */
    abstract void interpreter(Context text);

    /**
     * 声明一个方法用于执行标记对应的命令
     */
    public abstract void execute();
}
  • 非终结符表达式角色:
public class ExpressionNode extends Expression {
    private ArrayList<Expression> list = new ArrayList<Expression>();
    @Override
    void interpreter(Context text) {
        while (true){
            if (text.currentToken() == null){
                break;
            }else if (text.currentToken().equals("END")) {
                text.skipToken("END");
                break;
            }else{
                Expression commandExpression = new CommandExpression();
                commandExpression.interpreter(text);
                list.add(commandExpression);
            }
        }
    }
    //循环执行命令集合中的每一条命令
    @Override
    public void execute() {
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            ((Expression)iterator.next()).execute();
        }
    }
}
public class CommandExpression extends Expression {
    private Expression expression;
    @Override
    void interpreter(Context text) {
        if (text.currentToken().equals("LOOP")){
            expression = new LoopCommandExpression();
            expression.interpreter(text);
        }else{
            expression = new PrimitiveCommandExpression();
            expression.interpreter(text);
        }
    }

    @Override
    public void execute() {
        expression.execute();
    }
}
public class LoopCommandExpression extends Expression {
    private int number;
    private Expression commandExpression;
    @Override
    void interpreter(Context text) {
        text.skipToken("LOOP");
        number=text.currentNumber();
        text.nextToken();
        commandExpression = new ExpressionNode();
        commandExpression.interpreter(text);
    }
    @Override
    public void execute() {
        for(int i=0;i<number;i++) {
            commandExpression.execute();
        }
    }
}
  • 终结符表达式角色:
public class PrimitiveCommandExpression extends Expression {
    private String name;
    private String textStr;
    @Override
    void interpreter(Context text) {
        name = text.currentToken();
        text.skipToken(name);
        if (!name.equals("PRINT") && !name.equals("BREAK") && !name.equals ("SPACE")){
            System.err.println("非法命令!");
        }
        if (name.equals("PRINT")){
            textStr = text.currentToken();
            text.nextToken();
        }
    }
    @Override
    public void execute() {
        if (name.equals("PRINT")){
            System.out.print(textStr);}
        else if (name.equals("SPACE")){
            System.out.print(" ");}
        else if (name.equals("BREAK")){
            System.out.println();}
    }
}
  • 测试主函数:
public class Main {
    public static void main(String[] args){
        String text = "LOOP 2 PRINT 杨过 SPACE SPACE PRINT 小龙女 BREAK END PRINT 郭靖 SPACE SPACE PRINT 黄蓉";
        Context context = new Context(text);

        Expression expression = new ExpressionNode();
        expression.interpreter(context);
        expression.execute();
    }
}
  1. 解释器模式的优缺点
    优点:
    可扩展性比较好;增加了新的解释表达式的方式;易于实现简单文法。
    缺点:
    该模式比较难以理解,可利用的场景少,有可能会造成类爆炸,由于该模式采用的事递归,不利于调试。
锐捷 MPLS VPN 配置 ISP内部配置 , PE设备和CE设备之间的接口不开启 ( 只在物理接口上配置 , loopback 口不配置 )最后一步关闭 ipv4 单播 , 如果你发现路由奇奇怪怪的 , 可以尝试一下。both --> 同时配置 import export 值。绑定后接口会重置 , 且接口的路由会转到VRF路由表中。这里基本上绑定了 vrf 实例的接口都需要宣告进去。vpnv 4 通道是用来传递 mpls 路由的。先建立邻居管理,建立VPNV4通道。这里要做双向引入 , 才会有路由。export 导出值。 阅读详情

相关推荐

架构——异地多活成熟的架构模式

摘要: 本文系统介绍了三种异地多活架构模式:业务定制型、业务通用型和存储通用型。业务定制型针对核心业务定制化设计,复杂度低但扩展性差;业务通用型通过统一配套服务(流量调度、配置中心等)实现多业务兼容,适合业务量大但一致性要求不高的场景;存储通用型依托分布式一致性数据库(如OceanBase、TiDB)天然支持强一致性,适合金融等高要求场景,但对部署距离和成本有较高限制。文章对比了各模式的优缺点及适用场景,为不同业务需求下的架构选型提供了实践指导。

小志的博客 7087

解释器模式(interpreter)

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果在一个系统中需要匹配字符的需求在软件的很多地方都会使用,而且行为之间都非常类似,过去的做法是针对特定的需求,编写特定的函数,比如判断Email、匹配电话号码等等,与其为每一个特定需求都写一个算法函数,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了待匹配字符串的集合。

无简介 3285

发那科机器人Modbus通讯配置全攻略:从IP设置到信号调试

本文详细介绍了发那科机器人Modbus通讯的配置方法,从基础认知到IP设置、端口配置、信号调试及故障排查。重点讲解了UOP和DI/DO信号的配置技巧,帮助工程师快速实现机器人与PLC的稳定通讯,提升自动化系统效率。

weixin_27872611的博客 621

解释器模式

解释器模式

Charge8的博客 1006

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

calibre QRC提取寄生参数

typical将上面的文件QCI_flow里面的文件 在Cp 到当前 ,其实应该是某几个文件,但是我给忘记了 就全cp过来了 ,无影响,不过也希望大佬指正。

2202_75711937的博客 1518

设计模式第17讲——解释器模式(Interpreter)

一、什么是解释器模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图 5.1 Expression——抽象表达式(Abstract Expression)5.2 终结符表达式(Terminal Expression)5.3 非终结符表达式(Nonterminal Expression)5.4 InterpreterVariables——上下文(Context)5.5 testInterpreter 六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 2029

如何利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率),如何理解网络稀疏度

grena工具箱被设计用于fMRI数据的图论网络分析。它是一套MATLAB函数和基于MATLAB的接口,用于常规的fMRI预处理,用于计算和统计分析最常用的网络指标,如小世界参数、效率、度、间性、关联性、层级性、同步性和模块化。......

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 9174

设计模式之解释器模式的魅力:让代码读懂你的语言

解释器模式(Interpreter pattern)是一种行为型(Behavioral Pattern)的设计模式,用于定义语言的语法规则表示,并提供解释器来处理句子中的语法。该模式将句子表示为一个抽象语法树,每个节点代表一个语法规则,通过递归地解释这些节点来实现对句子的解释。

犬余的博客 3596

Python爬虫实战:高效爬取Vimeo高清视频

在当今数字化时代,视频内容已成为互联网的重要组成部分。Vimeo作为一个高质量的视频分享平台,拥有大量优质视频资源。然而,Vimeo并未提供直接下载视频的选项,因此,我们需要借助Python爬虫技术来获取这些高清视频。(HTTP Live Streaming)格式存储。Vimeo的视频通常不会直接暴露。Vimeo的视频通常以。

2201_76125261的博客 429

机器人在果园内行巡检仿真(2D雷达、realsense相机)

DiffBot是一种具有两个轮子的自主差动驱动机器人。它的主要处理单元是一个运行Ubuntu Mate 20.04和ROS 1 (ROS Noetic)中间件的Raspberry pi4b。该存储库包含ROS驱动包、真实机器人的ROS控制硬件接口和模拟DiffBot的配置。修改配置文件orchard_world.launch。

如果想成为中心,那么就到中心去吧。 1311

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

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

3万+

YOLOv11改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进C3k2

基于拓扑几何约束的动态蛇卷积用于管状结构分割DSConv(Dynamic Snake Convolution,动态蛇形卷积)模块的设计主要是为了更好地处理管状结构的分割任务,解决传统卷积在处理细管状结构时的不足。

Limiiiing的博客 1628

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

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

专注后端开发 1037

精雕软件(JDpaint) 5.5 绿色版

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

STM32F407中文手册

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

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

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

毕富国的博客 648

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

胖子胖子大胖子的博客 1058

Statistics and Machine Learning Toolbox

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

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

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

小相探索IT世界 1827

23、java设计模式--解释器模式

如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。//用于两个整数相加//用于两个整数相加//用于n个整数相加sum += i;return sum;上面的形式比较单一、有限,如果形式变化非常多,这就不符合要求,因为加法和减法运算,两个运算符与数值可以有无限种组合方式。比如 1+2+3+4+5、1+2+3-4等等。显然,现在需要一种翻译识别机器,能够解析由数字以及 + - 符号构成的合法的运算序列。

zht245648124的博客 1058

Java的23种设计模式---(16)解释器模式

解释器模式(Interpreter) 解释器模式是一种不常使用的设计模式,用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计。 当需要开发一种新的语言时,可以考虑使用解释器模式。 尽量不要使用解释器模式,后期维护会很麻烦,在项目中,可以使用Jruby,Groovy,Java的JS引擎来替代解释器的作用,弥补java语言的不足之处。 角色构成: A...

Mr.Cao 264

java中23种设计模式--解释器模式

兄弟们,老铁们.又到了学习锻炼我们可爱小小大脑的时候了~~~~~ 今天继续来学习设计模式,正所谓一天一个效果不错!! 喝了这碗鸡血,学就完了~~~ 态度决定一切,实力扞卫尊严!人要经得起诱惑耐得住寂寞! 1.解释器模式定义 定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子。 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构件一个解释器,该解释器通过解释这些句子来解决该问题. 2.解释器模式结构 抽象表达式角色:声明一个抽象的.

weixin_37967166的博客 202

23种设计模式【Java】解析 - 解释器模式

解释器模式 目的 为语言创建解释器,通常由语言的语法和语法分析来定义。 类图 角色 AbstractExpression 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个 interpret() 方法,称为解释操作。 TerminalExpression 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如公式 R=R1+R2 , R1 和 R2 就是终结符,对应

liyifan687的博客 348

java实现23种设计模式之解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。 这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 构建语法树,定义终结符与非终结符。 应用实例:编译器、运算表达式计算。 package com.ceshi22; public interface Expression...

weixin_30345577的博客 76

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

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

忆、瞻的专栏 1084

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

解释器模式 简介 解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。 解释器模式是指给定一个使用规定格式和语法的语言,并且建立一个解释器来解释该语言中的句子。解释器本身就是一种按照规定的语法进行解析的方案,但是总体来说也是一种使用频率相对较低但学习难度较大的设计模式。 结构 抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方

JavaTeachers的博客 356

JAVA23种设计模式(13):解释器模式,重要程度★

23种设计模式介绍:https://mp.youkuaiyun.com/postedit/90552052 1.1 意图 在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用“编译原理”中的解释器模式来实现了。虽然使用解释器模式的实例不是很多,但对于满足以上特点,且对运行效率要求不是很高的应用实例,如果用解...

sinat_35566306的博客 232

Java 23种设计模式之解释器模式

解释器模式

小成的博客 257
上一篇: Git关联本地项目到git上
下一篇: JAVA23种设计模式之中介者模式
CoderJu
博客等级 码龄11年 11粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值