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

news/2024/9/21 22:12:10 标签: 设计模式, 解释器模式

1.解释器模式定义

        用于定义语言的语法规则表示,并提供解释器来处理句子中的语法;

1.1 解释器模式的优缺点

优点

  • 易于修改、扩展,因为在解释器模式中使用类来表示语言的文法规则,因此就可以通过继承等机制改变或者扩展文法,每个文法规则都可以表示为一个类,因此我们可以快速地实现一个迷你的语言;
  • 实现文法比较容易,在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂;
  • 增加新的解释表达式比较方便,如果用户需要增加新的解释表达式,只需对应增加一个新的表达式就可以了,原有表达式类不需要修改,符合开闭原则;

缺点

  • 对于复杂文法难以维护,在解释其中一条规则至少要定义一个类,因此一个语言中如果有太多的文法规则,就会使类的个数急剧增加,当值系统的维护难以管理;
  • 执行效率低,在解释器模式中大量的使用了循环和递归调用,所有复杂的句子执行起来,整个过程非常繁琐;

1.2 解释器模式使用场景

  • 当语言的文法比较简单,并且执行效率不是关键问题.
  • 当问题重复出现,且可以用一种简单的语言来进行表达
  • 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象的语法树的时候 

 2.解释器模式原理

  • 抽象表达式类(Abstract Expression):定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret();
  • 终结符表达式类(Terminal Expression):是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体的终结表达式与之对应;
  • 非终结符表达式类(Nonterminal Expression):也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式,;
  • 环境类(Context):通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值;
  • 客户端:主要任务是将需要分析的表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法;

3.解释器模式的实现

【实例】

        以加减乘除运算为例

  • 运算符只包含加、减、乘、除,并且没有优先级的概念;
  • 表达式中,先书写数字,后书写运算符,空格隔开;

【代码】

        表达式接口

public interface Expression {

    long interpret();
}

        数字表达式-终结符表达式类

public class NumExpression implements Expression {

    private long number;

    public NumExpression(long number) {
        this.number = number;
    }

    public NumExpression(String number) {
        this.number = Long.parseLong(number);
    }

    @Override
    public long interpret() {
        return this.number;
    }
}

        非终结符表达式类

/**
 * 加法运算
 **/
public class PluExpression implements Expression{

    private Expression exp1;
    private Expression exp2;

    public PluExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpret() {
        return exp1.interpret() + exp2.interpret();
    }
}

/**
 * 减法运算
 **/
public class SubExpression implements Expression {

    private Expression exp1;
    private Expression exp2;

    public SubExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpret() {
        return exp1.interpret() - exp2.interpret();
    }
}

/**
 * 乘法运算
 **/
public class MulExpression implements Expression {

    private Expression exp1;
    private Expression exp2;

    public MulExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpret() {
        return exp1.interpret() * exp2.interpret();
    }
}

/**
 * 除法
 **/
public class DivExpression implements Expression {

    private Expression exp1;
    private Expression exp2;

    public DivExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpret() {
        return exp1.interpret() / exp2.interpret();
    }
}

        客户端

public class Client {

    public static void main(String[] args) {

        ExpressionInterpreter e = new ExpressionInterpreter();
        long result = e.interpret("6 2 3 2 4 / - + *");
        System.out.println(result);
    }
}

http://www.niftyadmin.cn/n/5669541.html

相关文章

docker zookeeper集群启动报错:Cannot open channel to * at election address /ip:3888

下面几点需要注意的: 1、确认在每个$zookeeper_home/data/myid中有对应数字 2、是否关闭防火墙:systemctl stop firewalld,systemctl disable firewalld 3、zoo.cfg中的server需要写成以下形式的: 假如有两台机器,1…

python获取滑块验证码需要滑动的距离

我们以这个网站为例: http://120.86.191.138/hbgs/zwgk/dirData.do?dirId402881204e959150014e959f42f30014&subjectId93e889f2501d3fe8015024305bdf0efc 往后点到第四页后会出现验证码 一.获取到背景图片和缺口图片 我们发现图片是base64格式通过API直接发送 二.识别缺…

2024.9.20 Python模式识别新国大EE5907,PCA主成分分析,LDA线性判别分析,GMM聚类分类,SVM支持向量机

1.PCA 主成分分析用于特征提取、可视化和分类 根据要求,我在第一个代码框中完成了从指定路径提取图像数据,将其转换为灰度图像并将其展平。在这里,我将数字 88 设置为我的照片的标签,然后将所有 10 张照片传入代码。然后我定义了…

[模板]树的最长路径

[模板]树的最长路径 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n-1 条无向边,每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说,要找到一条路径,使得使得路径两端的点的距离最远…

百易云资产管理运营系统 ticket.edit.php SQL注入漏洞复现

0x01 产品简介 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能,帮助企业优化资产配置,提升运营效率。 0x02 漏…

c++初阶--c++类和对象(中)

大家好&#xff0c;我们今天来继续学习c的类和对象&#xff0c;今天我们来着重学习一下c中的运算符重载这一部分的知识。那话不多说&#xff0c;这就开始我们今天的学习吧。 目录 1. 运算符重载 1.1 一个简单的运算符重载示例 1.2 前置和后置重载 1.3 位移运算符<<和…

[数据集][图像分类]茶叶病害分类数据集6749张7类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;6749 分类类别数&#xff1a;7 类别名称:["Unlabeled","alg…

国标GB28181视频融合监控汇聚平台的方案实现及场景应用

Liveweb国标视频融合云平台基于端-边-云一体化架构&#xff0c;部署轻量简单、功能灵活多样&#xff0c;平台可支持多协议&#xff08;GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等&#xff09;、多类型设备接入(IPC/NVR/监控平台)&#xff0c;在视频能力上&#xff0…