1. 什么是“解释器模式?
解释器模式: 提供了评估语言的语法或表达式的方式。
这是基本不怎么使用的一种设计模式。
确实想不到什么场景一定要用此种设计模式。
实现这种模式的核心是:
- 抽象表达式:主要有一个
interpret()
操作
- 终结符表达式:
R = R1 + R2
中,R1
R2
就是终结符
- 非终结符表达式:
R = R1 - R2
中,-
就是终结符
- 环境(Context): 存放文法中各个终结符所对应的具体值。比如前面
R1
和R2
的值。
2. 优缺点
优点显而易见,每个文法规则可以表述为一个类或者方法。
这些文法互相不干扰,符合“开闭原则”。
由于每条文法都需要构建一个类或者方法,文法数量上去后,很难维护。
并且,语句的执行效率低(一直在不停地互相调用)。
3. 多语言实现
3.1 ES6 实现
为了方便说明,下面省略了“抽象表达式”的实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Context { constructor() { this._list = [] this._sum = 0 }
get sum() { return this._sum }
set sum(newValue) { this._sum = newValue }
add(expression) { this._list.push(expression) }
get list() { return [...this._list] } }
class PlusExpression { interpret(context) { if (!(context instanceof Context)) { throw new Error('TypeError') } context.sum = ++context.sum } }
class MinusExpression { interpret(context) { if (!(context instanceof Context)) { throw new Error('TypeError') } context.sum = --context.sum } }
const context = new Context()
context.add(new PlusExpression()) context.add(new PlusExpression()) context.add(new MinusExpression())
context.list.forEach((expression) => expression.interpret(context)) console.log(context.sum)
|
4. 参考