解释器模式
1.定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用
该表示来解释语言中的句子;为了解释一种语言,而为语言创建的解释器。
2.类型:行为型
3.适用场景:某个特定类型问题发生频率足够高
4.优点:语法由很多类表示,容易改变及扩展此“语言”。
5.缺点:当语法规则数目太多时,增加了系统复杂度。
6.相关设计模式:适配器模式
7.实例目录package
8.实例UML类图
9.代码
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 public interface Interpreter { 4 int interpret(); 5 }
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 public class AddInterpreter implements Interpreter{ 4 private Interpreter firstExpression, secondExpression; 5 public AddInterpreter(Interpreter firstExpression,Interpreter secondExpression){ 6 this.firstExpression = firstExpression; 7 this.secondExpression = secondExpression; 8 } 9 @Override 10 public int interpret() { 11 return firstExpression.interpret() + secondExpression.interpret(); 12 } 13 14 @Override 15 public String toString() { 16 return "+"; 17 } 18 }
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 public class MultiInterpreter implements Interpreter{ 4 private Interpreter firstExpression, secondExpression; 5 6 public MultiInterpreter(Interpreter firstExpression, Interpreter secondExpression) { 7 this.firstExpression = firstExpression; 8 this.secondExpression = secondExpression; 9 } 10 11 @Override 12 public int interpret() { 13 return firstExpression.interpret() * secondExpression.interpret(); 14 } 15 16 @Override 17 public String toString() { 18 return "*"; 19 } 20 }
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 public class NumberInterpreter implements Interpreter{ 4 private int number; 5 public NumberInterpreter(int number){ 6 this.number = number; 7 } 8 public NumberInterpreter(String number){ 9 this.number = Integer.parseInt(number); 10 } 11 @Override 12 public int interpret() { 13 return number; 14 } 15 }
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 public class OperatorUtil { 4 public static boolean isOperator(String symbol) { 5 return symbol.equals("+") || symbol.equals("*"); 6 } 7 8 public static Interpreter getExpressionObject( 9 Interpreter firstExpression, 10 Interpreter secondExpression, 11 String symbol) { 12 if(symbol.equals("+")){ 13 return new AddInterpreter(firstExpression,secondExpression); 14 }else if(symbol.equals("*")){ 15 return new MultiInterpreter(firstExpression,secondExpression); 16 } 17 return null; 18 } 19 }
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 import java.util.Stack; 4 5 public class GeelyExpressionParser { 6 private Stack<Interpreter> stack = new Stack<>(); 7 public int parse(String str) { 8 String[] strItemArray = str.split(" "); 9 for(String symbol : strItemArray){ 10 if(! OperatorUtil.isOperator(symbol)){ 11 Interpreter numberExpression = new NumberInterpreter(symbol); 12 stack.push(numberExpression); 13 System.out.println(String.format("入栈:%d",numberExpression.interpret())); 14 }else{ 15 //是运算符号,可以计算 16 Interpreter firstExpression = stack.pop(); 17 Interpreter secondExpression = stack.pop(); 18 System.out.println(String.format("出栈:%d 和 %d", 19 firstExpression.interpret(),secondExpression.interpret())); 20 Interpreter operator = OperatorUtil.getExpressionObject(firstExpression,secondExpression,symbol); 21 System.out.println(String.format("应用运算符:%s",symbol)); 22 int result = operator.interpret(); 23 NumberInterpreter resultExpression = new NumberInterpreter(result); 24 stack.push(resultExpression); 25 System.out.println(String.format("阶段结果入栈:%d",resultExpression.interpret())); 26 } 27 } 28 int result = stack.pop().interpret(); 29 return result; 30 } 31 }
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 public class Test { 4 public static void main(String[] args) { 5 String geelyInputStr = "60 100 11 + *"; 6 GeelyExpressionParser expressionParser = new GeelyExpressionParser(); 7 int result = expressionParser.parse(geelyInputStr); 8 System.out.println("解释器计算结果:" + result); 9 } 10 }
1 package com.geely.design.pattern.behavioral.interpreter; 2 3 import org.springframework.expression.Expression; 4 import org.springframework.expression.ExpressionParser; 5 import org.springframework.expression.spel.standard.SpelExpressionParser; 6 7 public class SpringTest { 8 public static void main(String[] args) { 9 ExpressionParser parser = new SpelExpressionParser(); 10 Expression expression = parser.parseExpression("100 * 2 + 400 * 1 + 66"); 11 int result = (Integer) expression.getValue(); 12 System.out.println(result); 13 } 14 }