python设计模式(十三):解释器模式
此前已经将创造型模式、结构性模式分享了,后面将分享模式设计中的另一种典型模式:行为型模式。
创造型模式是解决实体的生成问题、结构性模式是为了解决实体的组合、搭配问题 ,而行为型设计模式的出现是为了解决不同实体通信的问题。
解释器模式:开发者自定义一种“有内涵”的语言(或者叫字符串),并设定相关的解释规则,输入该字符串后可以输出公认的解释,或者执行程序可以理解的动作。这种模式被用在 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、解释器模式会引起类膨胀。
但实际上该模式的应用场景比较少
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python设计模式(十二):结构型模式总结
前面总结了创造型结构模式《python设计模式(四):单例模式及创建型模式总结》,及其创造性模式的常用几种模式总结:《python设计模式(一):工厂方法与抽象工厂及应用场景》、《python设计模式(二):建造者模式》、《python设计模式(三):原型模式—快速实例化类的一种途径》。 后续分量了结构型模式的几种代表模式: 《python设计模式(五):适配器模式——各种类接口的合并》 《python设计模式(六):桥接模式》 《python设计模式(七):组合模式》 《python设计模式(八):装饰模式》 《python设计模式(九):外观模式》 《python设计模式(十):享元模式》 《python设计模式(十一):代理模式模式》 常用的结构型模式为:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式,结构型的意思是处理类与类之间、系统与系统之间的逻辑结构,是协调类结构的重要模式设计思想。 适配器模式:将其他类或系统中的方法封装一个统一接口来调用,从而达到适配各种系统方法的目的。 桥接模式:处理抽象部分(类)与实体(实例化)之间的结构,可以使抽象部分和实例...
- 下一篇
python设计模式(十四):模板方法模式
定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容;在模板思想下,实体的整体框架是确定的,他是一个模板,但是模板下内容可变,从而实现了动态的更新流程或算法。 示例code: #encoding=utf-8"""实现一个客户点单后的处理流程流程"""classUser: def__init__(self,name,shop,times,number): self.name=name self.shop=shop self.times=times self.number=numberclassHandle: def__init__(self,user=None): self.user=user defInvoicen(self): """打印小票""" string="打印小票"\ "客户:{}"\ "商品:{}"\ "数量:{}"\ "时间:{}".format(self.user.name,self.user.shop,self.user.number,self.user.times) print(string) defMake...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程