Python设计模式编程中解释器模式的简单程序示例分享

785次阅读  |  发布于5年以前

模式特点:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

我们来看一下下面这样的程序结构:


    class Context:
      def __init__(self):
        self.input=""
        self.output=""

    class AbstractExpression:
      def Interpret(self,context):
        pass

    class Expression(AbstractExpression):
      def Interpret(self,context):
        print "terminal interpret"

    class NonterminalExpression(AbstractExpression):
      def Interpret(self,context):
        print "Nonterminal interpret"

    if __name__ == "__main__":
      context= ""
      c = []
      c = c + [Expression()]
      c = c + [NonterminalExpression()]
      c = c + [Expression()]
      c = c + [Expression()]
      for a in c:
        a.Interpret(context)

那么它所体现出的类图是这样的:

201632150316773.png \(682×450\)

再来看一个例子:


    #encoding=utf-8 
    # 
    #by panda 
    #解释器模式 

    def printInfo(info): 
      print unicode(info, 'utf-8').encode('gbk'), 

    #上下文类:演奏内容 
    class PlayContext(): 
      text = None 
      PlayText = None 

    #抽象表达式类 
    class Expression(): 
      def Interpret(self, context): 
        if len(context.PlayText) == 0: 
          return 
        else: 
          playKey = context.PlayText[0:1] 
          context.PlayText = context.PlayText[2:] 
          tmp = context.PlayText.index(' ') #找出第一个空格出现的位置 
          playValue = context.PlayText[0:tmp] 
          context.PlayText = context.PlayText[tmp+1:] 
          self.Excute(playKey,playValue) 

      def Excute(self,playKey,playValue): 
        pass 

    #音高 
    class Pitch(Expression): 
      pitch = None 
      def Excute(self, key, value): 
        value = int(value) 
        if value == 1: 
          self.pitch = '低音' 
        elif value == 2: 
          self.pitch = '中音' 
        elif value == 3: 
          self.pitch = '高音' 
        printInfo(self.pitch) 

    #音符 
    class Note(Expression): 
      Notes = { 
      'C':1,   
      'D':2, 
      'E':3,   
      'F':4,   
      'G':5,   
      'A':6,   
      'B':7,   
      } 
      note = None 
      def Excute(self, key, value):    
        self.note = self.Notes[key] 
        printInfo('%d' % self.note) 


    def clientUI(): 
      context = PlayContext() 
      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 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 " 
      expression = None; 
      while(len(context.PlayText) > 0): 
        str = context.PlayText[0:1]; 
        if(str == 'O'): 
          expression = Pitch() 
        elif(str == 'C' or str == 'D' or str == 'E' or str == 'F' or str == 'G' or str == 'A' or str == 'B' or str == 'P'): 
          expression = Note() 
        expression.Interpret(context) 

      return 

    if __name__ == '__main__': 
      clientUI(); 

类图:

201632150401221.gif \(695×368\)

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8