大话设计模式之解释器模式

解释器模式

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

涉及到的角色描述:

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

 

 

posted @ 2018-08-23 11:17  不二尘  阅读(184)  评论(0编辑  收藏  举报