首页 > 其他分享 >小谈设计模式(28)—解释器模式

小谈设计模式(28)—解释器模式

时间:2024-01-01 10:01:43浏览次数:36  
标签:解释器 小谈 int 28 context 设计模式 Expression public 表达式

(小谈设计模式(28)—解释器模式)

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 在这里插入图片描述

解释器模式

解释器模式是一种行为型设计模式,它提供了一种解释一个语言的方式,用于解析和执行特定的文法规则。该模式将一个语言表示为一个解释器,该解释器可以解释语言中的表达式,从而实现特定的行为。 在这里插入图片描述

角色分析

抽象表达式(Abstract Expression)

定义了一个抽象的解释操作,所有的具体表达式都继承自该抽象类。

终结符表达式(Terminal Expression)

表示语法中的终结符,即不再进行解释的表达式。

非终结符表达式(Non-terminal Expression)

表示语法中的非终结符,该表达式可以通过递归调用其他表达式来解释。

上下文(Context)

包含解释器需要的一些全局信息。

客户端(Client)

创建和配置解释器,然后调用解释器的解释方法来解释语言中的表达式。 在这里插入图片描述

工作原理

1

客户端创建和配置解释器,并将需要解释的语言表达式传递给解释器。

2

解释器根据语法规则,将表达式解释成相应的抽象语法树。

3

客户端调用解释器的解释方法,解释器根据抽象语法树递归地解释表达式,最终得到结果。 在这里插入图片描述

优缺点分析

优点

可扩展性

通过增加新的表达式类,可以轻松扩展语言的语法规则。

易于实现语法规则

解释器模式将每个语法规则都封装在一个表达式类中,使得每个规则的实现都相对简单。

易于修改和维护

由于解释器模式将语法规则和表达式分离,因此可以独立地修改和维护每个表达式类。

缺点

复杂性

随着语法规则的增加,解释器模式的复杂性也会增加,维护和理解整个解释器系统可能会变得困难。

性能问题

由于解释器模式需要递归地解释表达式,可能会导致性能问题,特别是处理大型表达式时。 在这里插入图片描述

Java程序示例

首先,我们定义抽象表达式接口 Expression,其中包含一个解释方法 interpret:

public interface Expression {
    int interpret(Context context);
}

然后,我们实现具体的终结符表达式 NumberExpression,它表示一个数字:

public class NumberExpression implements Expression {
    private int number;

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

    @Override
    public int interpret(Context context) {
        return number;
    }
}

接下来,我们实现具体的非终结符表达式 AddExpression,它表示两个表达式的相加操作:

public class AddExpression implements Expression {
    private Expression leftExpression;
    private Expression rightExpression;

    public AddExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret(Context context) {
        int leftValue = leftExpression.interpret(context);
        int rightValue = rightExpression.interpret(context);
        return leftValue + rightValue;
    }
}

接下来,我们定义上下文类 Context,用于存储解释器需要的全局信息:

public class Context {
    private Map<String, Integer> variables;

    public Context() {
        variables = new HashMap<>();
    }

    public void setVariable(String name, int value) {
        variables.put(name, value);
    }

    public int getVariable(String name) {
        return variables.get(name);
    }
}

最后,我们可以在客户端中使用解释器模式:

public class Client {
    public static void main(String[] args) {
        // 创建上下文
        Context context = new Context();
        context.setVariable("x", 10);
        context.setVariable("y", 5);

        // 创建表达式
        Expression expression = new AddExpression(
                new NumberExpression(context.getVariable("x")),
                new NumberExpression(context.getVariable("y"))
        );

        // 解释表达式
        int result = expression.interpret(context);
        System.out.println("Result: " + result); // 输出结果: Result: 15
    }
}

分析

在上面的示例中,我们创建了一个上下文对象,并设置了两个变量 x 和 y 的值。然后,我们创建了一个表达式对象,该表达式对象表示将变量 x 和 y 相加的操作。最后,我们调用表达式的解释方法,传入上下文对象,得到最终的结果并输出。 在这里插入图片描述

总结

解释器模式是一种用于解释和执行特定语言的设计模式。它通过将语言表示为一个解释器,并使用抽象语法树来解释表达式,实现了特定的行为。尽管存在一些缺点,但解释器模式在某些特定场景下仍然是一个有用的设计模式。

标签:解释器,小谈,int,28,context,设计模式,Expression,public,表达式
From: https://blog.51cto.com/u_16193391/9054923

相关文章

  • js设计模式之单例模式
    //字面量constlogi={name:"贾维斯",password:'123456',method:function(){}}/***闭包:*1.闭包是指有权访问另一个函数作用域中的变量的函数*2.创建闭包的常见方式,就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,*优点:*......
  • P4528 题解
    这篇题解并不做任何形式上的理论推导,而是在于引导像我一样的蒟蒻,如何在遇到这样的题时,不会陷入数据结构暴力分别求三种形态的深渊里无法自拔。看到这道题我们的第一想法应该是把三种形态的数量都求出来,如果可以的话,这题马上就秒掉了。那么我们尝试着去求——比较简单的可能是高......
  • Java 中设计模式
    Java中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模......
  • P2898 [USACO08JAN] Haybale Guessing G 题解
    题目传送门前置知识二分答案|并查集解法对条件的合法性判断其他题解已经讲得很明白了,这里不再赘述。这里主要讲一下用并查集实现黑白染色问题。以下内容称被覆盖为黑色,不被覆盖为白色。本题因为是单向染色,即从白到黑,故可类似luoguP1840ColortheAxis和D的并查集或......
  • STM32定时器驱动WS2812
    最近在学STM32F103的定时器的标准库驱动,在学到定时器的比较输出功能时发现它可以和DMA配合一起使用产生一连串占空比各不同的PWM波,于是我立刻想到用这个东西来驱动WS2812,手边正好有一串30颗灯珠的WS2812灯带。WS2812的通信协议数据格式WS2812是一种采用单线通信方式的全......
  • 策略设计模式(Strategy)
    策略设计模式(Strategy):可以整体的替换一个算法的实现部分,能够整体的替换算法,能让我们轻松地用不同方法解决同一个问题。 1. 示例程序举一个收银的例子,普通用户打95折,会员打8折,超级会员打6折。如果在一个函数里面去解决这些问题,那么增加会员类型和折扣变化的时候会导致代码臃肿,难......
  • 桥接设计模式 (Bridge)
    1.问题引出实现某件产品,某产品有多种品牌(brand)和类型(kind)。比较直观的一种实现方式,多重继承如下图所示,多重继承的两大缺点:会导致有过多的类(类的数量=品牌数量*类型数量);新增品牌则需要新增所有的类型类,新增类型则需要新增所有的品牌类,违反了单一职责原则(单一职责原则:对类来说的,即......
  • SRE Google运维解密 28-34章
    第四部分管理第二十八章迅速培养SRE加入on-call如何给新手带上喷气背包,同时保证老手的速度不受影响?成功的SRE团队离不开信任一一为了维持全球化服务的正常运转,我们必须信任on-call团队了解系统如何运行,可以诊断系统的异常情况,善于利用资源和寻求帮助,以及可以在压力下保......
  • GB28181监控系统LiteCVR视频监控技术在农业种植园中的应用
    随着科技的进步,LiteCVR视频监控技术已经成为农业现代化不可或缺的一部分。在农业种植园中,这种技术的应用为农业生产带来了诸多便利。首先,LiteCVR视频监控技术为种植园提供了24小时的实时监控。无论是白天还是夜晚,管理人员都可以通过视频监控系统随时了解种植园的情况,掌握作物的生......
  • 28 液晶屏7寸LCD显示测试
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述前文中,我们已经实现了HDMI输出实验,米联客的HDMI输出采用了FPGA实现了HDMI输出协议,直接驱动了HDMI接口......