设计模式之解释器模式

1.解释器模式概念

它允许为语言定义一个语法,并且可以创建一个解析器来解释该语言中的句子。这种模式主要用于解决当有一个语言需要解释执行,并且你希望将该语言中的句子表示为一个抽象语法树时。

2.解释器模式的组成

1)抽象表达式(Abstract Expression)

定义了解释器的接口,包含了解释方法 interpret。

2)终结符表达式(Terminal Expression)

实现与文法中的终结符相关的操作。

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

包含对其他表达式的引用,并在解释过程中根据文法规则组合这些表达式的结果。

4)上下文(Context)

包含解释器之外的一些全局信息,可能被各个解释器使用。

3.举个栗子

以加减乘除为例

如下图

4.代码实现

1)抽象表达式

Calculation

java 复制代码
package org.xiji.interpreter;

/**
 * 定义计算接口
 */
public interface Calculation {

    /**
     * 计算结果
     */
    double calculate();
}

2)终结表达式

Number

java 复制代码
package org.xiji.interpreter;

/**
 * 实现数字类
 */
public  class Number implements Calculation{
    private double number;

    public Number() {
    }

    public Number(double number) {
        this.number = number;
    }

    public double getNumber() {
        return number;
    }

    public void setNumber(double number) {
        this.number = number;
    }

    @Override
    public double calculate() {
        return number;
    }
}

3)非终结表达式

Symbols

java 复制代码
package org.xiji.interpreter;

/**
 * 实现符号抽象类
 */
public abstract class Symbols implements Calculation{


    /**
     * 左边  右边
     *
     */
    protected Calculation left;
    protected Calculation right;

    public Symbols( Calculation left, Calculation right) {
        this.left = left;

        this.right = right;
    }

    @Override
    public abstract double calculate() ;
}

add

java 复制代码
package org.xiji.interpreter;

public class Add extends Symbols{
    public Add(Calculation left, Calculation right) {
        super(left, right);
    }

    @Override
    public double calculate() {
        //减法
        return super.left.calculate() + super.right.calculate();
    }
}

sub

java 复制代码
package org.xiji.interpreter;

public class Sub extends Symbols{
    public Sub(Calculation left, Calculation right) {
        super(left, right);
    }

    @Override
    public double calculate() {
        //减法
        return super.left.calculate() - super.right.calculate();
    }
}

div

java 复制代码
package org.xiji.interpreter;

public class Div extends Symbols{
    public Div(Calculation left, Calculation right) {
        super(left, right);
    }

    @Override
    public double calculate() {
        //除法
        return super.left.calculate() / super.right.calculate();
    }
}

mul

java 复制代码
package org.xiji.interpreter;

public class Mul extends Symbols{
    public Mul(Calculation left, Calculation right) {
        super(left, right);
    }

    @Override
    public double calculate() {
        //乘法

        return super.left.calculate() * super.right.calculate();
    }
}

4)测试类

java 复制代码
package org.xiji.interpreter;

/**
 * 解释器模式测试
 */
public class InterpreterMain {

    public static void main(String[] args) {
        //以 1+2+3-4为例


        Sub sub = new Sub(
                new Add(
                        new Add(
                                new Number(1), new Number(2)
                        ), new Number(3)
                ), new Number(4)
        );




        double calculate = sub.calculate();
        System.out.println("1+2+3-4");
        System.out.println("( ( ( 1+2 ) + 3) + 4) ");

        System.out.println(calculate);

        //构建 2*3+6/5+3
        /**
         *  ((2*3) +(6/5) +3 )
         */
        Add add = new Add(
                new Add(
                        new Mul(
                                new Number(2), new Number(3)
                        ),
                        new Div(
                                new Number(6), new Number(5)
                        )
                ),
                new Number(3)
        );
        System.out.println("2*3+6/5+3");
        System.out.println("((2*3) +(6/5) +3 )");
        System.out.println(add.calculate());
    }
}

5.运行结果

相关推荐
蝎子莱莱爱打怪3 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷5 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了7 小时前
Java 自动化部署
java·后端
ma_king7 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室8 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞12 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing12 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven9714 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德1 天前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty