20、Python与设计模式--解释器模式

一、模拟吉他

要开发一个自动识别谱子的吉他模拟器,达到录入谱即可按照谱发声的效果。除了发声设备外(假设已完成),最重要的就是读谱和译谱能力了。分析其需求,整个过程大致上分可以分为两部分:根据规则翻译谱的内容;根据翻译的内容演奏。我们用一个解释器模型来完成这个功能。

class PlayContext():
    play_text = None

class Expression():
    def interpret(self, context):
        if len(context.play_text) == 0:
            return
        else:
            play_segs=context.play_text.split(" ")
            for play_seg in play_segs:
                pos=0
                for ele in play_seg:
                    if ele.isalpha():
                        pos+=1
                        continue
                    break
                play_chord = play_seg[0:pos]
                play_value = play_seg[pos:]
                self.execute(play_chord,play_value)
    def execute(self,play_key,play_value):
        pass

class NormGuitar(Expression):
    def execute(self, key, value):
        print "Normal Guitar Playing--Chord:%s Play Tune:%s"%(key,value)

PlayContext类为谱的内容,这里仅含一个字段,没有方法。Expression即表达式,里面仅含两个方法,interpret负责转译谱,execute则负责演奏;NormGuitar类覆写execute,以吉他 的方式演奏。
业务场景如下:

if __name__=="__main__":
    context = PlayContext()
    context.play_text = "C53231323 Em43231323 F43231323 G63231323"
    guitar=NormGuitar()
    guitar.interpret(context)

打印如下:
Normal Guitar Playing--Chord:C Play Tune:53231323
Normal Guitar Playing--Chord:Em Play Tune:43231323
Normal Guitar Playing--Chord:F Play Tune:43231323
Normal Guitar Playing--Chord:G Play Tune:63231323

二、解释器模式

解释器模式定义如下:给定一种语言,定义它的文法表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。典型的解释器模式中会有终结符和非终结符之说,语法也根据两种终结符,决定语句最终含义。上例中,非终结符就是空格,终结符就是整个句尾。

三、解释器模式的优点和应用场景

优点:
1、在语法分析的场景中,具有比较好的扩展性。规则修改和制订比较灵活。
应用场景:
1、若一个问题重复发生,可以考虑使用解释器模式。这点在数据处理和日志处理过程中使用较多,当数据的需求方需要将数据纳为己用时,必须将数据“翻译”成本系统的数据规格;同样的道理,日志分析平台也需要根据不同的日志格式翻译成统一的“语言”。
2、特定语法解释器。如各种解释型语言的解释器,再比如自然语言中基于语法的文本分析等。

四、解释器模式的缺点

1、解释规则多样化会导致解释器的爆炸;
2、解释器目标比较单一,行为模式比较固定,因而重要的模块中尽量不要使用解释器模式。

时间: 2024-08-30 12:19:03

20、Python与设计模式--解释器模式的相关文章

PHP设计模式——解释器模式

声明:本系列博客参考资料<大话设计模式>,作者程杰.         解释器模式:Given a language, define arepresentation for its grammar along with an interpreter that uses therepresentation to interpret sentences in the language.给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子.        类图

Java设计模式--解释器模式

解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. Interpreter Pattern Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language. 类图 模式的结构与使用 解释器模式的结构中包

16、Python与设计模式--模板模式

一.股票查询客户端 投资股票是种常见的理财方式,我国股民越来越多,实时查询股票的需求也越来越大.今天,我们通过一个简单的股票查询客户端来认识一种简单的设计模式:模板模式.根据股票代码来查询股价分为如下几个步骤:登录.设置股票代码.查询.展示.构造如下的虚拟股票查询器: class StockQueryDevice(): stock_code="0" stock_price=0.0 def login(self,usr,pwd): pass def setCode(self,code):

5、Python与设计模式--代理模式

一.网络服务器配置白名单 代理模式是一种使用频率非常高的模式,在多个著名的开源软件和当前多个著名的互联网产品后台程序中都有所应用.下面我们用一个抽象化的简单例子,来说明代理模式. 首先,构造一个网络服务器: #该服务器接受如下格式数据,addr代表地址,content代表接收的信息内容 info_struct=dict() info_struct["addr"]=10000 info_struct["content"]="" class Serv

4、Python与设计模式--原型模式

一.图层 大家如果用过类似于Photoshop的平面设计软件,一定都知道图层的概念.图层概念的提出,使得设计.图形修改等操作更加便利.设计师既可以修改和绘制当前图像对象,又可以保留其它图像对象,逻辑清晰,且可以及时得到反馈.本节内容,将以图层为主角,介绍原型模式. 首先,设计一个图层对象. class simpleLayer: background=[0,0,0,0] content="blank" def getContent(self): return self.content d

8、Python与设计模式--门面模式

一.火警报警器(1) 假设有一组火警报警系统,由三个子元件构成:一个警报器,一个喷水器,一个自动拨打电话的装置.其抽象如下: class AlarmSensor: def run(self): print "Alarm Ring..." class WaterSprinker: def run(self): print "Spray Water..." class EmergencyDialer: def run(self): print "Dial 11

11、Python与设计模式--桥梁模式

一.画笔与形状 在介绍原型模式的一节中,我们举了个图层的例子,这一小节内容,我们同样以类似画图的例子,说明一种结构类设计模式:桥梁模式.在一个画图程序中,常会见到这样的情况:有一些预设的图形,如矩形.圆形等,还有一个对象-画笔,调节画笔的类型(如画笔还是画刷,还是毛笔效果等)并设定参数(如颜色.线宽等),选定图形,就可以在画布上画出想要的图形了.要实现以上需求,先从最抽象的元素开始设计,即形状和画笔(暂时忽略画布,同时忽略画笔参数,只考虑画笔类型). class Shape: name="&qu

17、Python与设计模式--迭代器模式

一.迭代器与生成器 今天的主角是迭代器模式.在python中,迭代器并不用举太多的例子,因为python中的迭代器应用实在太多了(不管是python还是其它很多的编程语言中,实际上迭代器都已经纳入到了常用的库或者包中).而且在当前,也几乎没有人专门去开发一个迭代器,而是直接去使用list.string.set.dict等python可迭代对象,或者直接使用__iter__和next函数来实现迭代器.如下例: if __name__=="__main__": lst=["hel

18、Python与设计模式--访问者模式

一.药房业务系统 假设一个药房,有一些大夫,一个药品划价员和一个药房管理员,它们通过一个药房管理系统组织工作流程.大夫开出药方后,药品划价员确定药品是否正常,价格是否正确:通过后药房管理员进行开药处理.该系统可以如何实现?最简单的想法,是分别用一个一个if-else-把划价员处理流程和药房管理流程实现,这样做的问题在于,扩展性不强,而且单一性不强,一旦有新药的加入或者划价流程.开药流程有些变动,会牵扯比较多的改动.今天介绍一种解决这类问题的模式:访问者模式.首先,构造药品类和工作人员类: cla