第二十五章 解释器模式
1. 核心思想
解释器模式用于描述如何使用面向对象语言构建一个简单的语言解释器。在某些情况下,为了更好地描述某些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则,这些问题的实例将对应为该语言中的句子。如在金融业务中,经常需要定义一些模型运算来统计、分析大量的金融数据,从而窥探一些商业发展趋势。
定义一个语言,定义它的文法的一种表示;并定义一个解释器,该解释器使用该文法来解释语言中的句子。
解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。比方说,我们常常会在字符串中搜索匹配的字符或判断一个字符串是否符合我们规定的格式,这种技术就是正则表达式。
2. UML类图
3. 框架代码
from abc import ABC, abstractmethod
import sys
class Context:
pass
class AbstractExpession(ABC):
@abstractmethod
def interpret(self, context: Context):
pass
class TerminalExpression(AbstractExpession):
def interpret(self, context: Context):
print(
f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
class NonterminalExpression(AbstractExpession):
def interpret(self, context: Context):
print(
f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
if __name__ == "__main__":
context = Context()
for exp in (TerminalExpression(),NonterminalExpression(),TerminalExpression()):
exp.interpret(context)
4. 模型说明
4.1 设计要点
所谓解释器模式就是给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。解释器模式的角色划分:
- 抽象表达式角色(AbstractExpression):该角色声明一个所有的具体表达式角色都需要实现的抽象接口,该接口主要是一个解释操作interpert()方法。
- 终结符表达式角色(TerminalExpression):该角色实现了抽象表达式角色所要求的接口,文法中的每一个终结符都有一个具体终结表达式与之对应。
- 非终结符表达式角色(Nonterminal Expression):该角色是一个具体角色,文法中的每一条规则都对应一个非终结符表达式类。
- 环境角色(Context):该角色提供解释器之外的一些全局信息。
- 客户端角色(Client):该角色创建一个抽象语法树,调用解释操作。
4.2 优缺点
- 优点
- 可扩展性比较好,灵活。
- 增加了新的解释表达式的方式。
- 易于实现简单文法。
- 缺点
- 需要建大量的类,因为每一种语法都要建一个非终结符的类。
- 解释的时候采用递归调用方法,导致有时候函数的深度会很深,影响效率。
5. 应用场景
- 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
- 一些重复出现的问题可以用一种简单的语言来进行表达。
- 一个简单语法需要解释的场景。