行为型模式-解释器模式

Posted 风流 少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型模式-解释器模式相关的知识,希望对你有一定的参考价值。

定义

案例

加减法计算器。

/**
 * 抽象表达式类
 */
public abstract class AbstractExpression 
    // 解释器
    public abstract int interpret(Context context);

/**
 * 封装变量的类(变量也是一种表达式)
 */
public class Variable extends AbstractExpression 
    // 变量名
    private String name;

    public Variable(String name) 
        this.name = name;
    

    @Override
    public int interpret(Context context) 
        // 当表达式是变量的时候此时解释器是用来获取变量的值
        // 如果整个表达式的值的最后一个表达式是一个值,整个解释器就结束
        return context.getValue(this);
    

    @Override
    public String toString() 
        return name;
    

/**
 * 加法表达式
 */
public class Minus extends AbstractExpression 

    // -号左边的表达式
    private AbstractExpression left;
    // -号右边的表达式(right可能还是一个加减操作)
    private AbstractExpression right;

    public Minus(AbstractExpression left, AbstractExpression right) 
        this.left = left;
        this.right = right;
    

    @Override
    public int interpret(Context context) 
        return left.interpret(context) - right.interpret(context);
    

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


/**
 * 加法表达式
 */
public class Plus extends AbstractExpression 

    // +号左边的表达式
    private AbstractExpression left;
    // +号右边的表达式
    private AbstractExpression right;

    public Plus(AbstractExpression left, AbstractExpression right) 
        this.left = left;
        this.right = right;
    

    @Override
    public int interpret(Context context) 
        return left.interpret(context) + right.interpret(context);
    

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

/**
 * 环境角色类:整个表达式中的所有值都存储在这里
 */
public class Context 
    // 用来存储变量和对应的值
    private Map<Variable, Integer> map = new HashMap<>();

    // 添加变量的功能
    public void assign(Variable var, Integer value) 
        map.put(var, value);
    

    // 根据变量获取对应的值
    public int getValue(Variable var) 
        return map.get(var);
    

public class Client 
    public static void main(String[] args) 
        // 创建环境对象
        Context context = new Context();

        // 创建多个变量对象
        Variable a = new Variable("a");
        Variable b = new Variable("b");
        Variable c = new Variable("c");
        Variable d = new Variable("d");
        context.assign(a, 1);
        context.assign(b, 2);
        context.assign(c, 3);
        context.assign(d, 4);
		
		// 一层嵌套一层,类似于递归
        AbstractExpression expression = new Minus(a, new Plus(new Minus(b, c), d));
        int result = expression.interpret(context);
        // (a - ((b - c) + d))=-2
        System.out.println(expression + "=" + result);
    

以上是关于行为型模式-解释器模式的主要内容,如果未能解决你的问题,请参考以下文章

从零开始学习Java设计模式 | 行为型模式篇:解释器模式

JAVA SCRIPT设计模式--行为型--设计模式之Interpreter解释器模式(15)

JAVA设计模式(22):行为型-解释器模式(Interpreter)

手撸golang 行为型设计模式 解释器模式

Java进阶篇设计模式之九----- 解释器模式和迭代器模式

设计模式-行为型模式讲解二(模板策略解释器)