一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
Interpreter模式(解释器模式)
简介
Interpreter模式 :
- 指的是给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器就是被用来解释这门指定语言中句子。它是一种类行为型模式。
- 解释器模式类似于计算机的语言的解释器的作用,比如你定义一种语言,然后定义它的一种文法的表示,解释器的作用就是用来解释这门语言的句子,比如定义的语言中#表示我,¥表示你,%表示和,那么#%¥就会被解释器解释成我和你的意思。
示例程序:
语法规则:Robert 和 John 是男性, Julie 是一个已婚的女性,输入姓名,判断相关信息。
/**
* 抽象表达式
* 为所有解释器的基础类
*/
class AbstractExpression {
interpret(context) {
}
}
/**
* 终结符表达式
*/
class TerminalExpression extends AbstractExpression {
constructor(data) {
super()
this.data = data;
}
interpret(context) {
return context.includes(this.data);
}
}
/**
* 非终结符表达式(组合式表达式)-- 或操作
*/
class OrExpression extends AbstractExpression {
constructor(expressionA, expressionB) {
super()
this.expressionA = expressionA;
this.expressionB = expressionB;
}
interpret(context) {
return this.expressionA.interpret(context) || this.expressionB.interpret(context);
}
}
/*
* 环境类
*/
class ClientOne {
//规则:Robert 和 John 是男性
getMaleExpression(){
let robert = new TerminalExpression("Robert");
let john = new TerminalExpression("John");
return new OrExpression(robert, john);
}
//规则:Julie 是一个已婚的女性
getMarriedWomanExpression(){
let julie = new TerminalExpression("Julie");
let married = new TerminalExpression("Married");
return new OrExpression(julie, married);
}
}
const client = new ClientOne()
let isMale = client.getMaleExpression();
let isMarriedWoman = client.getMarriedWomanExpression();
let isMan1 = isMale.interpret("John");
let isMan2 = isMale.interpret("Robert");
let isMan3 = isMale.interpret("Bill");
let isMarriedWomen = isMarriedWoman.interpret("Married Julie");
console.log("John is male? \n"+(isMan1?"Yes":"no"));
console.log("Robert is male? \n"+(isMan2?"Yes":"no"));
console.log("Bill is male? \n"+(isMan3?"Yes":"no"));
console.log("Julie is a married women? \n"+(isMarriedWomen?"Yes":"no"));
//结果
//John is male?
//Yes
//Robert is male?
//Yes
//Bill is male?
//no
//Julie is a married women?
//Yes
角色:
- 抽象表达式:AbstractExpression类
- 终结符表达式:TerminalExpression类
- 非终结符表达式:OrExpression类
- 环境类:ClientOne类
应用场景:
- 当问题重复出现,且可以用一种简单的语言来进行表达时。
- 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释。
优点:
-
易于改变和扩展文法。
-
由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法
缺点:
-
执行效率较低,在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度慢
-
对于复杂的文法比较难维护