设计模式之解释器模式

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.运行结果

相关推荐
Mr.Jessy2 分钟前
Web APIs 学习第六天:BOM、location对象与本地存储
开发语言·前端·javascript·学习·web api·bom
LIZhang201617 分钟前
基于ffmpeg8.0录制mp4文件
开发语言·c++
咕白m62523 分钟前
基于Java 实现 PPT 到 PDF 的高效转换
java
_OP_CHEN25 分钟前
C++进阶:(九)深度剖析unordered_map 与 unordered_set容器
开发语言·c++·stl容器·哈希表·哈希桶·unordered_map·unordered_set
七夜zippoe26 分钟前
Java并发编程基石:深入理解JMM(Java内存模型)与Happens-Before规则
java·开发语言·spring·jmm·happens-before
Mark Studio38 分钟前
QT linux 静态编译问题记录
开发语言·qt
YDS82944 分钟前
苍穹外卖 —— Spring Task和WebSocket的运用以及订单统一处理、订单的提醒和催单功能的实现
java·spring boot·后端·websocket·spring
速易达网络1 小时前
C语言常见推理题
java·c语言·算法
m0_639817151 小时前
基于springboot纺织品企业财务管理系统【带源码和文档】
java·服务器·前端
Lei_3359671 小时前
[設計模式]二十三種設計模式
设计模式