博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python设计模式(十三):解释器模式
阅读量:6849 次
发布时间:2019-06-26

本文共 1493 字,大约阅读时间需要 4 分钟。

此前已经将创造型模式、结构性模式分享了,后面将分享模式设计中的另一种典型模式:行为型模式。

创造型模式是解决实体的生成问题、结构性模式是为了解决实体的组合、搭配问题 ,而行为型设计模式的出现是为了解决不同实体通信的问题。

解释器模式:开发者自定义一种“有内涵”的语言(或者叫字符串),并设定相关的解释规则,输入该字符串后可以输出公认的解释,或者执行程序可以理解的动作。这种模式被用在 SQL 解析、符号处理引擎等

解释器模式要实现两个核心角色:

  • 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

  • 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。

# -*- coding:utf-8 -*- import time import datetime """实现一段简单的中文编程""" class Code:     """自定义语言"""     def __init__(self, text=None):         self.text = text class InterpreterBase:     """自定义解释器基类"""     def run(self, code):         pass class Interpreter(InterpreterBase):     """实现解释器方法,实现终结符表达式字典"""     def run(self, code):         code = code.text         code_dict = {
'获取当前时间戳': time.time(), "获取当前日期": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}         print(code_dict.get(code)) if __name__ == '__main__':     test = Code()     test.text = '获取当前时间戳'     data1 = Interpreter().run(test)     test.text = '获取当前日期'     data2 = Interpreter().run(test) ----------------- 1550156061.1181707 2019-02-14 22:54:21

上面是个很简单的案例,同时我们也可以增加不同语言和不同的功能。

  • 主要解决:对于一些固定文法构建一个解释句子的解释器。

  • 何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

  • 应用实例:编译器、运算表达式计算。

  • 优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。

  • 缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 

但实际上该模式的应用场景比较少

2019-03-17-22_09_23.png

转载地址:http://knlul.baihongyu.com/

你可能感兴趣的文章
批量修改文件后缀名的方法(当前目录及子目录)
查看>>
Linux Shell脚本攻略
查看>>
[信息图]手机进化史
查看>>
我的友情链接
查看>>
“我来管管看”系列:采购误差缘何而来?
查看>>
关于iSCSI的一些介绍
查看>>
iptables 学习笔记
查看>>
MongoDB与内存
查看>>
tcpdump抓取mysql报文
查看>>
ubuntu下的中文搜索sphinx的安装配置
查看>>
三.Object-C 方法,封装 (下)
查看>>
2003年9月全国计算机等级考试二级C语言笔试试题及答案
查看>>
重复制造轮子之——字节数组写入文件
查看>>
IMP 导入表结构到指定用户
查看>>
windows下FTP连接linux简单演示-dos操作
查看>>
redhat6启动U盘安装
查看>>
H3C 交换机 和windows NPS结合实现内网802.1X认证
查看>>
device "eth0" does not seem to be present, delaying initialization
查看>>
mysql日志
查看>>
深入理解jQuery插件开发
查看>>