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

时间:2022-05-06 12:33:20

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

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

?
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)

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

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

 

再来看一个例子:

?
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();


类图:

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