设计模式-解释器模式

背景

四则运算问题:先输入表达式的形式如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。具体代码与设计模式关系不大,故略。

你可能感兴趣的:(设计模式,解释器模式)