解释器模式

Java 开发打飞机小游戏(附完整源码) 上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy { 阅读详情

四则运算问题

计算a+b-c

 要求:

  先输入表达式的形式,eg:a+b+c-d+e,并且字母不可重复

  分别输入 a,b,c,d,e

  计算出结果

 

传统方案

 编写方法,来接受根据数据输入的数值进行解析,得出结果

​

>问题分析:

 如果加入新的运算符,比如 * /。 则不利于扩展,另外让一个方法来解析会造成程序结构混乱

 

解释器模式

 1.在编译原理中一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树 。这里的词法分析器和语法分析器都可以看做是解释器

 2.解释器模式( Interpreter Pattern ):是指给 定一个语言表达式定义它的文法的一种表示,并定义一个解释器 使用该解释器来 解释语言中的句子表达式

 

结构图

在这里插入图片描述

 1.环境角色(Context):是含有解释器之外的全局信息

 2.抽象表达式(AbstractExpression): 声明一个抽象的解释操作 这个方法为抽象语法树中所有的节点所共享

 3.终结符表达式(TerminalExpression): 实现与文法中的终结符相关的解释操作

 4.非终结符表达式(NonTermialExpression):文 法中的非终结符实现解释操作

 5.Client :输入 Context 和 TerminalExpression 信息通过输入即可

 

应用场景

 1.应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树

 2.一些重复出现的问题可以用一种简单的语言来表达一个简单语法需要解释的场景
  【编译器 、 运算表达式计算、正则表达式 、 机器人等】

 

优缺点

 优点:

  ✔️ 程序具有良好的扩展性

 缺点:

  ❌解释器模式会引起类膨胀

  ❌ 解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低

 

解决四则运算问题

在这里插入图片描述

代码

//抽象类表达式
public abstract class Expression {
    //通过HashMap键值对,可以获取变量的值 HashMap = {a:10,b:20}
    public abstract int interpreter(HashMap<String,Integer> var);
}

//变量解释器
public class VarExpression extends Expression {
    private String key; //key:用户输入的符号 a,b,c...

    public VarExpression(String key) {
        this.key = key;
    }

    //根据变量名获取对应值
    @Override
    public int interpreter(HashMap<String, Integer> var) {
        return var.get(this.key);
    }
}

// 抽象运算符解析器
public class SymbolExpression extends Expression{
    protected Expression left;  //左边部分
    protected Expression right; //右边部分

    public SymbolExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    //此处由子类实现,于是赋予空实现
    @Override
    public int interpreter(HashMap<String, Integer> var) {
        return 0;
    }
}
//加法解释器
public class AddExpression extends SymbolExpression{

    public AddExpression(Expression left, Expression right) {
        super(left, right);
    }

    public int interpreter(HashMap<String, Integer> var) {
        //super.left.interpreter(var)  返回left表达式对应的值
        //super.right.interpreter(var)  返回right表达式对应的值
        return super.left.interpreter(var) + super.right.interpreter(var);
    }
}

//减法解释器
public class SubExpression extends SymbolExpression {

    public SubExpression(Expression left, Expression right) {
        super(left, right);
    }

    //求left 与 right 表达式 相减的结果
    public int interpreter(HashMap<String, Integer> var) {
        return super.left.interpreter(var) - super.right.interpreter(var);
    }
}

public class Calculator {

    //定义表达式
    private Expression expression;

    //构造函数传参
    //expStr ==> a+b
    public Calculator(String expStr){
        //安排运算的先后顺序
        Stack<Expression> stack = new Stack<>();
        //表达式拆分成字符数组
        char[] chars = expStr.toCharArray();//[a,+,b]

        Expression left = null;
        Expression right = null;

        //遍历字符数组,即[a,+,b,+,c...]
        for (int i = 0; i < chars.length; i++) {
            //针对不同情况做处理
            switch (chars[i]){
                case '+':
                    left = stack.pop(); //a
                    right = new VarExpression(String.valueOf(chars[++i]));//取出右边表达式 b
                    stack.push(new AddExpression(left,right)); //根据left和right 构建 加法解析器放入stack
                    break;
                case '-':
                    left = stack.pop(); //a
                    right = new VarExpression(String.valueOf(chars[++i]));//取出右边表达式 b
                    stack.push(new SubExpression(left,right)); //根据left和right 构建 减法解析器放入stack
                    break;
                default:
                    //如果是Var,则创建给VarExpression对象,并push到stack中
                    stack.push(new VarExpression(String.valueOf(chars[i])));
            }
        }
        //
        this.expression = stack.pop();
    }

    public int run(HashMap<String,Integer> var){
        //将表达式a+b 和 var={a:10,b:20}传递给expression的interpreter进行解释执行
        return this.expression.interpreter(var);
    }
}
public class Client {
    public static void main(String[] args) throws Exception {
        String expStr = getExpStr();
        HashMap<String,Integer> var = getValue(expStr);
        Calculator calculator = new Calculator(expStr);
        System.out.println("运算结果:"+expStr+"="+calculator.run(var));
    }

    //获取表达式
    public static String getExpStr() throws Exception{
        System.out.println("请输入表达式:");
         return (new BufferedReader(new InputStreamReader(System.in))).readLine();
    }

    //获取值映射
    public static HashMap<String,Integer> getValue(String expStr) throws Exception{
        HashMap<String, Integer> map = new HashMap<>();

        for (char ch : expStr.toCharArray()) {
            if ( ch != '+' && ch != '-'){
                if (! map.containsKey(String.valueOf(ch))){
                    System.out.println("请输入"+String.valueOf(ch)+"的值:");
                    String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
                    map.put(String.valueOf(ch),Integer.valueOf(in));
                }
            }
        }

        return map;
    }
}
AutoSar实战营 - 总目录 欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址 阅读详情

相关推荐

【亲测】ubuntu20.4 安装CUDA11.8

一步一步搭建C++ CUDA CUDNN TENSORRT OPENCV DNN ONNXRUNTIME推理环境

weixin_40950590的博客 3895

解释器模式(InterpreterPattern)

定义 定义一个语言的文法,并创建一个解释器去解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。 结构图 角色与理解 解释器模式共分为三种角色: AbstractExpression(抽象表达式):终结符表达式与非终结符表达式的共同父类,声明了抽象的解释行为。 TerminalException(终结符表达式):抽象表达式的子类,包含文法中终结符的解释操作。 NonterminalException(非终结符表达式):抽象表达式的子类,实现了文法中非终结符的解释操作,

码农架构 528

【WSL2+Ubuntu+Docker Desktop】迁移到D盘

该篇文章包含将WSL2+ubuntu+Docker Desktop从C盘迁移到D盘

哈茶的博客 3930

解释器模式(InterpreterPattern)

基本介绍:    给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。1. 文法:即语法规则。在解释器模式中每一个语法都将对应一个解释器对象,用来处理相应的语法规则。它对于扩展、改变文法以及增加新的文法规则都很方便。2. 解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。3. 在解释器模式中可以通过一种称之为...

BrandoLv 198

Python抓取摄像头图像,进行AI识别(一)

本文介绍了如何用Python获取海康威视摄像头的图像并进行AI识别。主要内容包括:1)准备工作,包括摄像头IP设置和密码重置方法;2)使用Python的Requests库通过ISAPI接口获取实时图像;3)示例代码展示如何保存摄像头图像。整个过程为后续AI图像识别提供了基础,通过简单的Python代码即可实现专业监控设备的图像采集功能。

Hahafantuan的博客 1514

手把手教你学Simulink——基于Simulink的电压型 vs 电流型整流器性能对比

摘要:本文基于Simulink平台对比分析了电压型整流器(VSR)和电流型整流器(CSR)的性能差异。VSR采用电容滤波,具有高功率因数(PF>0.99)、低输入电流THD(<3%)等优势,但动态响应较慢;CSR采用电感滤波,动态响应快(<0.05s),但THD较高(5%~8%)。研究建立了统一测试平台,详细对比了两者在稳态性能、动态响应、效率等方面的差异,并给出了控制算法实现和参数优化建议。通过量化分析,为电力电子工程师提供了拓扑选型依据,可根据恒压/恒流需求选择最优方案,有效缩短开发周

MHD0815的博客 173

解释器模式介绍

解析器模式用于定义语言的语法规则表示,并提供解释器来处理句子中的语法。解释器模式使用频率不算高,通常用来描述如何构建一个简单“语言”的语法解释器。它只在一些非常特定的领域被用到,比如编译器、规则引擎、正则表达式、SQL 解析等。不过,了解它的实现原理同样很重要,能帮助你思考如何通过更简洁的规则来表示复杂的逻辑。今天我们就来讲解下解析器设计模式。

qq_25409421的博客 1502

【网络安全】浅谈数据库攻击复现及相关安全优化

4、准备数据库服务器为了安全正式环境应该把数据库单独放一台服务器,只允许让应用服务器 IP 来访问数据库服务器,通过独立两者,就算其中一台发生问题,另一台也是好的,进一步降低了危险性。5、定时备份数据库开发定时备份功能,可以使用 Crontab,或者其他框架,设定周期备份数据,哪怕是数据丢失或被删除也可以快速恢复。

2401_88545587的博客 221

设计模式解释器模式(InterpreterPattern)

核心模块:抽象表达符、非终结表达符、终结表达符、环境类 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:正则表达式,自定义语言,计算器; 优点:易于扩展,增加新的符号只用增加新的表达式即可; 缺点:复杂的文法难以维护,存在大量循环和递归操作,复杂的句子,速度很慢; 注意: 1,每一个

didiao11300的专栏 292

005、开关电源中的基本拓扑结构简介

本文介绍了开关电源设计中常见拓扑结构的特性与选型经验。文章从实际炸机案例入手,强调深入理解拓扑的重要性,详细分析了Buck、Boost、Buck-Boost等非隔离拓扑以及反激、正激、半桥、全桥、LLC等隔离拓扑的工作原理、设计要点和典型误区,重点指出各拓扑的电压/电流应力、效率瓶颈和常见设计错误。作者根据多年经验总结出不同功率等级和输入输出条件下的拓扑选型原则,并强调细节设计对成败的决定性影响。文章通过大量工程实例说明,正确的拓扑选择和参数计算是电源设计成功的基础,而忽略基础原理将导致反复修改甚至炸机风险

Jack010169的博客 224

【图论】系列(一)之图论的构成

图论是研究图的数学分支,本章介绍了图论的基本构成和概念

qq_30066733的博客 748

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

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

咖啡程序员 1692

事件驱动的 SAP 工作流:从 BOR 事件到 Event Linkage 的落地与排障全景图

摘要: SAP工作流中的Event是业务对象状态变化的系统广播机制,如发票录入、采购订单释放等事件。通过事件驱动,业务程序与流程引擎解耦,业务只需发布事件,流程引擎负责后续处理。文章详细解析了SAP工作流事件的完整链路,包括事件定义、触发机制、事件容器传递、SWE2配置的关键作用,以及事件不触发时的排查方法。重点介绍了事件在启动流程、终止任务、等待步骤和主动创建中的应用,并结合采购订单审批案例说明事件的实际使用场景和配置要点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 189

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

解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释器模式中,语言中的每个符号都被定义为一个(对象)类,这样整个程序就被转换成一个具体的对象树。每个节点(即对象)都表示一个表达式中的一个符号,而整棵树则表示一个完整的表达式。通过遍历这棵树,解释器就可以对表达式进行解析和执行。

m0_51176516的博客 2131

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

20/23 解释器模式

解释器模式(Interpreter Pattern) 提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 1.案例 现在有一个描述字符构建模块,其具体描述如下: 现在有一个对象几何,现在需要重新按照一个描述输出 1.1版本 代码如下: public class Student { public string StudentName { get; se

XiaoCai 1641

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

解释器模式(Interpreter Pattern)

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

qq_26880671的博客 202

SAP B1中文培訓教材_SDK

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

详解设计模式:解释器模式

解释器模式(interpreter pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 解释器模式 这种模式被用在 SQL 解析、符号处理引擎等。 解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。 本篇文章内容包括:关于解释器模式、解释器模式 Demo(

栗筝i的博客 3574

解释器模式-Interpreter Pattern

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

心猿意碼 5189

设计模式之解释器模式

解释器模式 解释器模式(Interpreter Pattern)属于行为模式,它定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。 解释器模式的四个角色 AbstractExpression(抽象表达式):声明一个抽象的解释操作,这个方法为抽象语法树中所有的节点所共享。 TerminalExpression(终结符表达式):实现与文法中的终结符相关的解释操作。比如 c = a + b,其中 a 和 b 就是终结符,而对应 a 和 b 的解释器就是终结符

JustToFaith 2597

解释器模式(Java)

解释器模式一般就是用于创造变成语言了什么的,一般使用不多,类似于易语言,它是将中文字符翻译成为C语言后,C 语言在编译运行的一种披着中文的C 语言,这个过程就大量使用了解释器模式 本次例子是一个将java部分语言转化为python的小程序(其实就2句) 我们知道java的输出是"System.out.println()" ,python的是“print()” java 的方法是void,pytho...

weixin_43486804的博客 1万+
上一篇: 备忘录模式
下一篇: 状态模式(State Pattern)
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值