设计模式之Interpreter模式(解释器模式)

288 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

Interpreter模式(解释器模式)

简介

Interpreter模式 :

  1. 指的是给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器就是被用来解释这门指定语言中句子。它是一种类行为型模式。
  2. 解释器模式类似于计算机的语言的解释器的作用,比如你定义一种语言,然后定义它的一种文法的表示,解释器的作用就是用来解释这门语言的句子,比如定义的语言中#表示我,¥表示你,%表示和,那么#%¥就会被解释器解释成我和你的意思。

示例程序:

 语法规则: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 文档解释。

优点:

  • 易于改变和扩展文法。

  • 由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法

缺点

  • 执行效率较低,在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度慢

  • 对于复杂的文法比较难维护