1. 人人编程首页
  2. 架构设计

解释器设计模式

 

意图

  • 给定一种语言,定义其语法的表示以及使用该表示来解释该语言中的句子的解释器。
  • 将域映射到语言,将语言映射到语法,将语法映射到分层的面向对象设计。

问题

一类问题在定义明确且易于理解的领域中反复出现。如果域以“语言”为特征,则可以通过解释“引擎”轻松解决问题。

讨论

解释器模式讨论:将领域语言(即问题表征)定义为简单的语言语法,将领域规则表示为语言句子,并解释这些句子以解决问题。该模式使用一个类来表示每个语法规则。而且由于语法通常在结构上是分层的,规则类的继承层次结构可以很好地映射。

抽象基类指定方法interpret()。每个具体的子类interpret()通过接受(作为参数)语言流的当前状态并将其添加到问题解决过程中来实现。

结构

解释器建议使用递归语法对域进行建模。语法中的每条规则要么是“复合”(引用其他规则的规则),要么是终端(树结构中的叶节点)。解释器依靠复合模式的递归遍历来解释它被要求处理的“句子”。

解释器设计模式

例子

解释器模式定义了语言的语法表示和解释语法的解释器。音乐家是口译员的例子。声音的音高及其持续时间可以用五线谱上的乐谱来表示。这种符号提供了音乐的语言。演奏乐谱中的音乐的音乐家能够再现所代表的每个声音的原始音高和持续时间。

解释器设计模式

检查清单

  1. 确定“小语言”是否能提供合理的投资回报。
  2. 定义语言的语法。
  3. 将语法中的每个产生式映射到一个类。
  4. 将这组类组织到复合模式的结构中。
  5. 在复合层次结构中定义一个interpret(Context)方法。
  6. 对象封装了输入和输出的Context当前状态,前者被解析,后者被累加。它由每个语法类操作,因为“解释”过程将输入转换为输出。

经验法则

  • 考虑到其最一般的形式(即基于复合模式分布在类层次结构上的操作),几乎所有复合模式的使用都将包含解释器模式。但是解释器模式应该保留给那些你想把这个类层次结构看作定义一种语言的情况。
  • 解释器可以使用状态来定义解析上下文。
  • Interpreter 的抽象语法树是 Composite(因此 Iterator 和 Visitor 也适用)。
  • 解释器的抽象语法树中的终端符号可以与享元共享。
  • 该模式不解决解析问题。当语法非常复杂时,其他技术(例如解析器)更合适。

本文来自转载,原文链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注