设计模式--第二十五章 解释器模式

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1. 核心思想

解释器模式用于描述如何使用面向对象语言构建一个简单的语言解释器。在某些情况下,为了更好地描述某些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则,这些问题的实例将对应为该语言中的句子。如在金融业务中,经常需要定义一些模型运算来统计、分析大量的金融数据,从而窥探一些商业发展趋势。

定义一个语言,定义它的文法的一种表示;并定义一个解释器,该解释器使用该文法来解释语言中的句子。

解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。比方说,我们常常会在字符串中搜索匹配的字符或判断一个字符串是否符合我们规定的格式,这种技术就是正则表达式。

2. UML类图

解释器模式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 设计要点

所谓解释器模式就是给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。解释器模式的角色划分:

  1. 抽象表达式角色(AbstractExpression):该角色声明一个所有的具体表达式角色都需要实现的抽象接口,该接口主要是一个解释操作interpert()方法。
  2. 终结符表达式角色(TerminalExpression):该角色实现了抽象表达式角色所要求的接口,文法中的每一个终结符都有一个具体终结表达式与之对应。
  3. 非终结符表达式角色(Nonterminal Expression):该角色是一个具体角色,文法中的每一条规则都对应一个非终结符表达式类。
  4. 环境角色(Context):该角色提供解释器之外的一些全局信息。
  5. 客户端角色(Client):该角色创建一个抽象语法树,调用解释操作。

4.2 优缺点

  1. 优点
    • 可扩展性比较好,灵活。
    • 增加了新的解释表达式的方式。
    • 易于实现简单文法。
  2. 缺点
    • 需要建大量的类,因为每一种语法都要建一个非终结符的类。
    • 解释的时候采用递归调用方法,导致有时候函数的深度会很深,影响效率。

5. 应用场景

  1. 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
  2. 一些重复出现的问题可以用一种简单的语言来进行表达。
  3. 一个简单语法需要解释的场景。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值