Python 解释器模式

时间:2022-01-18 14:31:02
#encoding=utf-8
#
#by panda
#解释器模式

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

#上下文类:演奏内容
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();