背景
四则运算问题:先输入表达式的形式如a+b+c-d,然后分别输入变量的值,最后输出结果。
传统模式:编写一个方法,接收表达式的形式,分析表达式,再根据分析结果执行相关操作。
问题:
不利于拓展,耦合性高,(如果想要加入乘法运算需要修改很多地方)
基本介绍
给定一个语言(表达式),定义他的文法的一种表示,并定义解释器,使用解释器解释语言。
最常见的例子:编译器
四个角色
①context:是环境角色,含有解释器之外的全局信息
②AbstractExpression:抽象表达式,有一个对外的抽象方法,用于解释操作。
③TerminalExpression:为终结符表达式,处理终结符相关操作,继承自AbstractExpression
④NonTerminalExpression:为非终结符表达式,处理非终结符相关操作,继承自AbstractExpression
具体实现
创建Expression抽象类,对外提供一个interpreter()解释语句的方法。
interpreter(map)需要传入一个map,map的key是表达式(abc),key是对应表达式的具体值(比如a对应1),返回值是一个int。
创建VarExpression类,继承自Expression抽象类。(对应abc)
有一个属性变量key就是他的表达式(如a),它的interpreter返回值就是他的表达式再map中对应的值。
创建SymbolExpression父类,继承自Expression抽象类(对应+ * -)
有两个Expression类的成员变量,分别表示自身对象左边的表达式和右边的表达式。
它的interpreter应该需要它的子类去实现,所以在这里就返回一个默认值(0).
创建SubExpression(-),AddExpression(+)继承自SymbolExpression
在他们实现interpreter方法时,根据对应的+-*方法,将左右Expression的值做运算后返回。
创建Calculate类(对应上述的context)解决逻辑问题。
利用栈,存储Expression类,遍历输入表达式,根据不同的运算符号和表达式构建出要传入interpreter的map和存储SubExpression中的左右Expression以及调用SubExpression。具体代码与设计模式关系不大,故略。