大话设计模式之解释器模式
解释器模式
给定一个语言,定义它文法的一种表示,并定义一个解释器,来解释该语言表示的意思。

涉及到的角色描述:
  AbstractExpression: 抽象表达式,声明一个抽象的解释操作父类,定义一个抽象的解释方法,具体的实现由子类解释器完成/ 
  TerminalExpression: 终结符表达式,实现文法中与终结符有关的解释操作,文法中每一个终结符都有一个具体的终结表达式与之对应 
  NonterminalExpression: 非终结符表达式,实现文法中与非终结符有关的解释操作 
  Context: 上下文环境类,包含解释器之外的全局信息 
  Client: 客户端,解析表达式,构建抽象语法树,执行具体的解释操作等.
优点
- 灵活性强,易于改变和扩展文法
缺点
- 因为每一条文法都可以对应至少一个解释器,会生成大量的类,导致后期维护困难,而且对应复杂的文法,构建语法树会显得异常繁琐.
具体实现实例
采用解释器模式解释“1+2+7”具体表达
抽象表达式
package com.chenpt.designModel.interpreterModel;
/**
 * @Author: chen
 * @Description: 抽象解释器
 * @Date: created in 2018/8/22
 * @Modified By:
 */
public interface ArithmeticExpression {
    int interpret();
}  
终结符表达式
package com.chenpt.designModel.interpreterModel;
/**
 * @Author: chen
 * @Description: 对运算符进行解释
 * @Date: created in 2018/8/22
 * @Modified By:
 */
public class OperatorExpression implements ArithmeticExpression {
    private ArithmeticExpression expression1,expression2;
    OperatorExpression(ArithmeticExpression expression1,ArithmeticExpression expression2){
        this.expression1=expression1;
        this.expression2=expression2;
    }
    @Override
    public int interpret() {
        return expression1.interpret()+expression2.interpret();
    }
} 
非终结表达式来解释该表达式的值
package com.chenpt.designModel.interpreterModel;
/**
 * @Author: chen
 * @Description: 对数字进行解释
 * @Date: created in 2018/8/22
 * @Modified By:
 */
public class NumExpression implements ArithmeticExpression {
    private int num;
    NumExpression(int num){
        this.num=num;
    }
    @Override
    public int interpret() {
        return num;
    }
}
具体实现
package com.chenpt.designModel.interpreterModel;
import java.util.Stack;
/**
 * @Author: chen
 * @Description: 业务处理类
 * @Date: created in 2018/8/22
 * @Modified By:
 */
public class Calculator {
    Stack<ArithmeticExpression> expressions = new Stack<>();
    Calculator(String content){
       ArithmeticExpression arithmeticExpression1, arithmeticExpression2;
       String[] elements = content.split("");
        for (int i = 0; i < elements.length; ++i) {
            switch (elements[i].charAt(0)) {
                case '+':
                    arithmeticExpression1 = expressions.pop();
                    arithmeticExpression2 = new NumExpression(Integer.valueOf(elements[++i]));
                    expressions.push(
                            new OperatorExpression(arithmeticExpression1, arithmeticExpression2));
                    break;
                default:
                    expressions.push(new NumExpression(Integer.parseInt(elements[i])));
                    break;
            }
        }
    }
    public int calculate() {
        return expressions.pop().interpret();
    }
}
客户端
package com.chenpt.designModel.interpreterModel;
/**
 * @Author: chen
 * @Description:
 * @Date: created in 2018/8/23
 * @Modified By:
 */
public class MainTest {
    public static void main(String[] args){
        Calculator calculator = new Calculator("1+2+7");
        System.out.println("结束="+calculator.calculate());
    }
}
//结果
结束=10
此模式lz也是囫囵吞枣的学习了一遍,仅做笔记使用,文中如有不当之处 欢迎留言指出!!!
  作者:
  不二尘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 
 
                     
                    
                 
                    
                

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号