解释器模式——用得很少,但还是要了解哈

一、基础简介

1、定义

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式

2、使用场景

  • 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  • 2、一些重复出现的问题可以用一种简单的语言来进行表达。
  • 3、一个简单语法需要解释的场景。

3、优缺点

优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。

缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法,递归是不推荐使用的。

4、模式结构分析

  • ** AbstractExpression(抽象表达式)**:在抽象表达式中声明了抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类。
  • TerminalExpression(终结符表达式):终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解释操作,在句子中的每一个终结符都是该类的一个实例。通常在一个解释器模式中只有少数几个终结符表达式类,它们的实例可以通过非终结符表达式组成较为复杂的句子。
  • NonterminalExpression(非终结符表达式):非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作,由于在非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归的方式来完成。
  • Context(环境类):环境类又称为上下文类,它用于存储解释器之外的一些全局信息,通常它临时存储了需要解释的语句。
解释器模式——用得很少,但还是要了解哈_第1张图片

二、实例实现

1、实例场景

比如做一个“加法/减法”的通用工具

2、AbstractExpression(抽象表达式)

package com.mfc.design.解释器模式.四则混合运算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description AbstractExpression(抽象表达式)
 */
public abstract class Expression {

    /**
     * 以环境为准,本方法解释给定的任何一个表达式
     */
    public abstract int interpret(Context ctx);

    /**
     * 将表达式转换成字符串
     */
    public abstract String toString();
}

3、NonterminalExpression(非终结符表达式)

加法:

package com.mfc.design.解释器模式.四则混合运算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description NonterminalExpression(非终结符表达式)
 */
public class Plus extends Expression {

    private Expression left,right;

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

    @Override
    public int interpret(Context ctx) {

        return left.interpret(ctx) + right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " + " + right.toString() + ")";
    }

}

减法:

package com.mfc.design.解释器模式.四则混合运算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:04
 *
 * @description NonterminalExpression(非终结符表达式)
 */
public class Minus extends Expression {

    private Expression left, right;

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

    @Override
    public int interpret(Context ctx) {

        return left.interpret(ctx) - right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " - " + right.toString() + ")";
    }
}

4、TerminalExpression(终结符表达式)

package com.mfc.design.解释器模式.四则混合运算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description TerminalExpression(终结符表达式)
 */
public class Constant extends Expression {

    private int value;

    public Constant(int value){
        this.value = value;
    }

    @Override
    public int interpret(Context ctx) {

        return value;
    }

    @Override
    public String toString() {
        return new Integer(value).toString();
    }

}

5、Context(环境类):环境类又称为上下文类

package com.mfc.design.解释器模式.四则混合运算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description Context(环境类):环境类又称为上下文类
 */
public class Context {

}

6、客户端

package com.mfc.design.解释器模式.四则混合运算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:04
 * @description
 */
public class Client {

    public static void main(String[] args) {
        Context context = new Context();
        Constant c1 = new Constant(1);
        Constant c2 = new Constant(2);
        Constant c3 = new Constant(3);
        Constant c4 = new Constant(4);
        Expression exp = new Minus(new Plus(c3, c2), new Minus(c4, c1));
        System.out.println(exp.toString() + "=" + exp.interpret(context));
    }

}

8、结果展示

((3 + 2) - (4 - 1))=2

Process finished with exit code 0

你可能感兴趣的:(解释器模式——用得很少,但还是要了解哈)