大话设计模式(Python版)--解释器模式

解释器模式v1:

#!/usr/bin/env python
from abc import abstractmethod,ABCMeta
class AbstractExpression:
    __metaclass__ = ABCMeta
    @abstractmethod
    def Interpret(self, context):
        pass

class TerminalExpression(AbstractExpression):
    def Interpret(self, context):
        print("termianl interpretor")

class NonterminalExpression(AbstractExpression):
    def Interpret(self, context):
        print("Nontermianl interpretor")

class Context:
    @property
    def Input(self):
        return self.__input
    @Input.setter
    def Input(self,value):
        self.__input = value
    @property
    def Output(self):
        return self.__output
    @Output.setter
    def Output(self,value):
        self.__output = value
        
def main():
    ct = Context()
    lt = list()
    lt.append(TerminalExpression())
    lt.append(NonterminalExpression())
    lt.append(TerminalExpression())              
    lt.append(TerminalExpression())
    for ae in lt:
        ae.Interpret(ct)

if __name__ == '__main__':
    main()
解释器模式v2:

#!/usr/bin/env python
from abc import ABCMeta, abstractmethod
import re 
class PlayContext:
    @property
    def PlayText(self):
        return self.__text
    @PlayText.setter
    def PlayText(self,value):
        self.__text = value

class Expression:
    __metaclass__ = ABCMeta
    def Interpret(self, context):
        if len(context.PlayText) == 0:
            return
        else:            
            playkey = context.PlayText[0]
            context.playText = context.PlayText[2:]
            index = context.playText.find(' ')
            playValue = context.PlayText[index+1]
            context.PlayText = context.PlayText[index+3:]
            #print('index',index)
            #print('PlayText',context.PlayText)
            self.Excute(playkey,playValue)
    @abstractmethod
    def Excute(self, key, value):
        pass

class Note(Expression):
    def Excute(self, key, value):
        notes = {'C':'1','D':'2','E':'3','F':'4',
                 'G':'9','A':'6','B':'7'}
        print(notes[key])

class Scale(Expression):
    def Excute(self, key, value):
        scales = {'1':'低音','2':'中音','3':'高音'}
        print(scales[value])

def main():
    context = PlayContext()
    print('上海滩')
    context.PlayText='O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 1'
    while(len(context.PlayText) > 3):
        strs = context.PlayText[0]
        if strs in ['O']:
            expression = Scale()
        elif (strs in ['C','D','E','F','G','A','B','P']):
            expression = Note()
        expression.Interpret(context)

if __name__ == '__main__':
    main()          


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值