模式特点:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
我们来看一下下面这样的程序结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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)
|
那么它所体现出的类图是这样的:
再来看一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#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();
|
类图: