解释器模式

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 }

 

posted @ 2019-01-06 17:24  逢春  阅读(131)  评论(0编辑  收藏  举报