关于设计模式:设计模式解释器模式

解释器模式

1.定义与类型

  • 定义:给定一个语言,定义它的文法的一种示意,并定义一个解释器,这个解释器应用该示意来解释语言中的句子
  • 为了解释一种语言,而为语言创立的解释器
  • 类型:行为型

2.实用场景

  • 某个特定类型问题产生频率足够高

3.长处

  • 语法由很多类示意,容易扭转及扩大此语言

4.毛病

  • 当语法规定数目太多,减少了零碎复杂度

5.相干设计模式

  • 解释器模式和适配器模式

6.Coding

  • 创立解释器顶级接口
public interface Interpreter {
    int interpreter();
}
  • 解释器的相干实现类
public class AddInterpreter implements Interpreter{
    private Interpreter firstExpression,secondExpression;

    public AddInterpreter(Interpreter firstExpression,Interpreter secondExpression){
        this.firstExpression = firstExpression;
        this.secondExpression = secondExpression;
    }
    @Override
    public int interpreter() {
        return this.firstExpression.interpreter() + this.secondExpression.interpreter();
    }

    @Override
    public String toString() {
        return "+";
    }
}
public class MultiInterpreter implements Interpreter{
    private Interpreter firstExpression,secondExpression;

    public MultiInterpreter(Interpreter firstExpression,Interpreter secondExpression){
        this.firstExpression = firstExpression;
        this.secondExpression = secondExpression;
    }
    @Override
    public int interpreter() {
        return this.firstExpression.interpreter() * this.secondExpression.interpreter();
    }

    @Override
    public String toString() {
        return "*";
    }
}
  • 创立数字解释器,用于解决入参
public class NumberInterpreter implements Interpreter {
    private int number;

    public NumberInterpreter(int number) {
        this.number = number;
    }

    public NumberInterpreter(String number) {
        this.number = Integer.parseInt(number);
    }

    @Override
    public int interpreter() {
        return this.number;
    }
}
  • 简略实现一个工具类
public class OperatorUtil {
    public static boolean isOperator(String symbol) {
        return (symbol.equals("+") || symbol.equals("*"));
    }

    public static Interpreter getExpressionObjects(Interpreter firstInterpreter, Interpreter secondInterpreter, String symbol) {
        if ("+".equals(symbol)) {
            return new AddInterpreter(firstInterpreter, secondInterpreter);
        } else if ("*".equals(symbol)) {
            return new MultiInterpreter(firstInterpreter, secondInterpreter);
        }
        return null;
    }
}
  • 自定义一个解释器语法
public class QchExpressionParser {
    private Stack<Interpreter> stack = new Stack<>();

    public int parse(String str) {
        String[] strArray = str.split(" ");
        for (String item : strArray) {
            if (!OperatorUtil.isOperator(item)) {
                NumberInterpreter numberInterpreter = new NumberInterpreter(item);
                stack.push(numberInterpreter);
                System.out.println(String.format("入栈:%d", numberInterpreter.interpreter()));
            } else {
                Interpreter firstInterpreter = stack.pop();
                Interpreter secondInterpreter = stack.pop();
                System.out.println(String.format("出栈:%d 和 %d", firstInterpreter.interpreter(), secondInterpreter.interpreter()));
                Interpreter expressionObjects = OperatorUtil.getExpressionObjects(firstInterpreter, secondInterpreter, item);
                System.out.println(String.format("利用运算符: %s", expressionObjects.interpreter()));
                int result = expressionObjects.interpreter();
                NumberInterpreter numberInterpreter = new NumberInterpreter(result);
                stack.push(numberInterpreter);
                System.out.println(String.format("阶段后果入栈:%d", result));
            }
        }
        int result = stack.pop().interpreter();
        return result;
    }
}
  • Test测试类
public class Test {
    public static void main(String[] args) {
        String geelyInputStr = "6 100 11 + *";
        QchExpressionParser expressionParser = new QchExpressionParser();
        int parse = expressionParser.parse(geelyInputStr);
        System.out.println("解释器执行后果为:"+parse);
    }
}
  • 控制台打印

7.源码

  • Spring框架中的应用
public class TestForSpring {
  
    public static void main(String[] args) {
      
        ExpressionParser parser = new SpelExpressionParser();
      
        Expression expression = parser.parseExpression("100 + 11 * 6");
      
        int result = (int)expression.getValue();
      
        System.out.println(result);
    }

}

  • debug看下源码

    • 这个办法解决咱们的表达式

    • 最初

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据