Python设计模式-解释器模式

Python设计模式-解释器模式

代码基于3.5.2,代码如下;
#coding:utf-8
#解释器模式

class PlayContext():
    play_text = None

class Expression():
    def interpreter(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,play_key,play_value):
        print("Normal Guitar Playing--Chord:{0} Play Tune:{1}".format(play_key,play_value))

if __name__ == "__main__":
    context = PlayContext()
    context.play_text = "C521312413 D123123123 H23123123 Y123231231"
    guitar = NormGuitar()
    guitar.interpreter(context)

解释器模式分析与解读

解释器模式

解释器模式,给定一种语言,定义它的文法表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。典型的解释器模式中会有终结符和非终结符之说,语法也根据两种终结符,决定语句最终定义;如果一种特定类型的问题发生频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

代码解读

1、先定义了PlayContext类,该类主要实现对语句进行封装,该例子中,主要封装乐谱的谱子;
2、定义了Expression类,该类定义了并实现了interpreter方法,该方法主要是实现对PlayContext中封装的语句进行语法解析,即分析乐谱中的每个乐谱;解析完成后调用execute方法来执行解析完成后的执行函数;
3、NormGuitar继承自Expression类,并重写了execute方法,具体实现语法解析完成后的执行过程。

代码运行结果如下:

Normal Guitar Playing--Chord:C Play Tune:521312413
Normal Guitar Playing--Chord:D Play Tune:123123123
Normal Guitar Playing--Chord:H Play Tune:23123123
Normal Guitar Playing--Chord:Y Play Tune:123231231

解释器模式应用场景:

1、若一个问题重复发生,可以考虑使用解释器模式,这点在数据处理和日志处理过程中使用较多,当数据的需求方将数据保存时,必须将数据翻译成本系统的数据规格;
2、特定语言解释器,如各种解释型语言的解释器,再比如自然语言中基于语法的文本分析。

优缺点分析

优点
1、在语法分析的场景中,具有比较好的扩展性,规则修改和制定比较灵活。
缺点
1、解释规则多样化会导致解释器臃肿;
2、解释器目标比较单一,行为模式比较固定,因而重要的模块中尽量不要使用解释器模式;
3、解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的问法可能难以管理和维护,当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值