zoukankan      html  css  js  c++  java
  • 大话设计模式之解释器模式

    解释器模式

      给定一个语言,定义它文法的一种表示,并定义一个解释器,来解释该语言表示的意思。

    涉及到的角色描述:

      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也是囫囵吞枣的学习了一遍,仅做笔记使用,文中如有不当之处 欢迎留言指出!!!

     

  • 相关阅读:
    6月15日学习日志
    6月14日学习日志
    6月13日学习日志
    6月12日学习日志
    给建民哥的意见
    6月10日学习日志
    6月9日学习日志
    6月8日学习日志
    梦断代码读书笔记3
    第二次冲刺(六)
  • 原文地址:https://www.cnblogs.com/chenpt/p/9522694.html
Copyright © 2011-2022 走看看