解析器模式

2021-05-31  本文已影响0人  金煜博

什么是解析器模式

给定一种语言,定义它的文法表示,并定义一个解释器,该解释器使用该表示来解释语言中句子(通过解析器解析自定义的表达式返回解析后的信息)

示例图

图片.png

示例场景

使用自定义的表达式进行相加 相减操作。
比如:e1=2 e2=8 e3=6, e1+e2=10, e2-e3=2, e1+e2-e3=4

示例代码

1.创建Expression解析器接口

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

2.创建Context上下文类

public class Context {
    private Map<Expression, Integer> map = new HashMap<>();

    //添加解析器对象
    public void add(Expression s, Integer value){
        map.put(s, value);
    }
    //获取解析后的值
    public int getValue(Expression s){
        return map.get(s);
    }
}

3.创建TerminalExpression终结表达式

public class TerminalExpression implements  Expression{
    @Override
    public int interpreter(Context context) {
        return context.getValue(this);
    }
}

4.创建NonTerminalExpression非终结表达式

public abstract class NonTerminalExpression implements Expression{
    Expression e1,e2;
    public NonTerminalExpression(Expression e1, Expression e2){
        this.e1 = e1;
        this.e2 = e2;
    }
}

5.创建非终结表达式实现类PlusOperation相加操作和MinusOperation相减操作

public class PlusOperation extends NonTerminalExpression {
    public PlusOperation(Expression e1, Expression e2) {
        super(e1, e2);
    }

    //将两个表达式相加
    @Override
    public int interpreter(Context context) {
        return this.e1.interpreter(context) + this.e2.interpreter(context);
    }
}
public class MinusOperation  extends NonTerminalExpression {
    public MinusOperation(Expression e1, Expression e2) {
        super(e1, e2);
    }

    //将两个表达式相减
    @Override
    public int interpreter(Context context) {
        return this.e1.interpreter(context) - this.e2.interpreter(context);
    }
}

6.创建Client启动类

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        TerminalExpression e1 = new TerminalExpression();
        TerminalExpression e2 = new TerminalExpression();
        TerminalExpression e3 = new TerminalExpression();
        context.add(e1, 2);
        context.add(e2, 8);
        context.add(e3, 6);
        System.out.println("------------------------------表达式相减操作");
        MinusOperation minusOperation = new MinusOperation(e1, e2);
        System.out.println(minusOperation.interpreter(context));
        System.out.println("------------------------------表达式相加操作");
        PlusOperation plusOperation = new PlusOperation(e1,e3);
        System.out.println(plusOperation.interpreter(context));
        System.out.println("------------------------------表达式先加再减操作");
        Expression expression = new MinusOperation(new PlusOperation(e1, e2), e3);
        System.out.println(expression.interpreter(context));
    }
}

7.运行结果


图片.png
上一篇 下一篇

猜你喜欢

热点阅读