乐趣区

关于设计模式:解释器模式-Interpreter

解释器模式是一种行为型设计模式,其目标是定义语言的文法,并且应用该语法来解释输出的表达式。上面是一个应用 TypeScript 实现的解释器模式的示例:

假如咱们须要计算一个简略的算术表达式(加、减、乘、除),咱们能够应用解释器模式来解决这个问题。

首先,咱们须要定义一个形象表达式类 Expression,它有一个形象办法 interpret():

abstract class Expression {public abstract interpret(): number;
}

而后,咱们定义具体的表达式类,例如 NumberExpression、AddExpression、SubstractExpression、MultiplyExpression 和 DivideExpression,它们都是 Expression 的子类,实现了 interpret() 办法。其中,NumberExpression 示意一个数字,其 interpret() 办法返回该数字;AddExpression 示意一个加法表达式,其 interpret() 办法返回两个表达式的和,以此类推。

class NumberExpression extends Expression {constructor(private value: number) {super();
  }

  public interpret(): number {return this.value;}
}

class AddExpression extends Expression {constructor(private left: Expression, private right: Expression) {super();
  }

  public interpret(): number {return this.left.interpret() + this.right.interpret();}
}

class SubtractExpression extends Expression {constructor(private left: Expression, private right: Expression) {super();
  }

  public interpret(): number {return this.left.interpret() - this.right.interpret();}
}

class MultiplyExpression extends Expression {constructor(private left: Expression, private right: Expression) {super();
  }

  public interpret(): number {return this.left.interpret() * this.right.interpret();}
}

class DivideExpression extends Expression {constructor(private left: Expression, private right: Expression) {super();
  }

  public interpret(): number {return this.left.interpret() / this.right.interpret();}
}

最初,咱们定义一个 Calculator 类,它蕴含一个 Expression 对象,并提供一个 calculate() 办法,应用该对象对表达式进行解释和计算:

class Calculator {
  private expression: Expression;

  constructor(expression: Expression) {this.expression = expression;}

  public calculate(): number {return this.expression.interpret();
  }
}

应用这些类,咱们能够结构一个简略的算术表达式并计算其值:

const expression = new SubtractExpression(new AddExpression(new NumberExpression(10), new NumberExpression(5)),
  new DivideExpression(new MultiplyExpression(new NumberExpression(8), new NumberExpression(2)), new NumberExpression(4))
);

const calculator = new Calculator(expression);
console.log(calculator.calculate()); // 输入 11

在下面的代码中,咱们结构了一个简单的算术表达式,而后应用 Calculator 对象计算表达式的值。这个例子展现了如何应用解释器模式来实现一个简略的表达式计算器。

解释器模式能够利用于很多畛域,例如编译器、语言解释器、正则表达式等。在 JavaScript 中,解释器模式能够用于以下场景:

正则表达式解析:正则表达式能够被看作是一种简略的语言,它应用语法规定来形容模式,例如匹配数字、字符、单词等。在 JavaScript 中,RegExp 对象就是一个解释器,它依据给定的正则表达式来解析字符串并返回匹配后果。

模板解析:在 Web 开发中,模板引擎是常见的技术之一,它能够将数据和模板联合生成 HTML 页面。在模板引擎中,解释器模式用来解析模板语法,例如条件语句、循环语句、变量等。

退出移动版