模式特点:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
我们来看一下下面这样的程序结构:
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)
那么它所体现出的类图是这样的:

再来看一个例子:
#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();
类图:
