天天看點

第19章 解釋器模式(Interpreter Pattern)解釋器模式 

     導讀:解釋器模式,平常用的比較的少,是以在寫這個模式之前在部落格園搜尋了一番,看完之後那叫一個頭大。篇幅很長,我鼓足了勁看了半天的描述跟解釋,可能是本人的水準有限,或者是耐心太差,看到一半就有點扛不住了。我感覺對于一個菜鳥或者是沒接觸過設計模式的人來說,在看設計模式的時候更希望作者能簡短的用幾行代碼來描述設計模式,這樣起碼看完大體有個概念。

     概述:

       Interpreter模式也叫解釋器模式,是由GoF提出的23種設計模式中的一種。Interpreter是行為模式之一,它是一種特殊的設計模式,它建立一個解釋器,對于特定的計算機程式設計語言,用來解釋預先定義的文法。

     結構圖:

第19章 解釋器模式(Interpreter Pattern)解釋器模式 

 代碼舉例(我已經最簡單化了,一看即懂)

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

<code> </code><code>/// &lt;summary&gt;</code>

<code>    </code><code>/// 解釋器上下文環境類。用來存儲解釋器的上下文環境,比如需要解釋的文法等。</code>

<code>    </code><code>/// &lt;/summary&gt;</code>

<code>    </code><code>class</code> <code>Context</code>

<code>    </code><code>{</code>

<code>        </code><code>private</code> <code>int</code> <code>sum;</code>

<code>        </code><code>public</code> <code>int</code> <code>Sum</code>

<code>        </code><code>{</code>

<code>            </code><code>get</code> <code>{ </code><code>return</code> <code>sum; }</code>

<code>            </code><code>set</code> <code>{ sum=value;}</code>

<code>        </code><code>}</code>

<code>    </code> 

<code>    </code><code>}</code>

<code>    </code><code>/// &lt;summary&gt;</code>

<code>    </code><code>/// 解釋器抽象類。</code>

<code>   </code><code>abstract</code> <code>class</code> <code>AbstractExpreesion</code>

<code>        </code><code>public</code> <code>abstract</code> <code>void</code> <code>Interpret(Context context);</code>

<code>      </code> 

<code>    </code><code>///   解釋器具體實作類。自加</code>

<code>    </code><code>class</code> <code>PlusExpression : AbstractExpreesion</code>

<code>        </code><code>public</code> <code>override</code> <code>void</code> <code>Interpret(Context context)</code>

<code>            </code><code>int</code> <code>sum = context.Sum;</code>

<code>            </code><code>sum++;</code>

<code>            </code><code>context.Sum = sum;</code>

<code>    </code><code>///   解釋器具體實作類。 自減</code>

<code>    </code><code>class</code> <code>MinusExpression : AbstractExpreesion</code>

<code>            </code><code>sum--;</code>

用戶端調用

<code>    </code><code>class</code> <code>Program</code>

<code>        </code><code>static</code> <code>void</code> <code>Main(</code><code>string</code><code>[] args)</code>

<code>            </code><code>Context context = </code><code>new</code> <code>Context();</code>

<code>            </code><code>context.Sum = 10;</code>

<code>            </code><code>List&lt;AbstractExpreesion&gt; list = </code><code>new</code> <code>List&lt;AbstractExpreesion&gt;();</code>

<code>            </code><code>//運作加法三次</code>

<code>            </code><code>list.Add(</code><code>new</code> <code>PlusExpression());</code>

<code>            </code><code>//運作減法兩次</code>

<code>            </code><code>list.Add(</code><code>new</code> <code>MinusExpression());</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i &lt; list.Count(); i++)</code>

<code>            </code><code>{</code>

<code>                </code><code>AbstractExpreesion expression = list[i];</code>

<code>                </code><code>expression.Interpret(context);</code>

<code>            </code><code>}</code>

<code>            </code><code>Console.WriteLine(context.Sum);</code>

<code>            </code><code>Console.ReadLine();</code>

<code>            </code><code>//得出結果為11</code>

  看完之後,是不是覺得很簡單,無非是設定幾個公式,然後統一進行執行。最終得到結果!設計模式代表的是一種思想,至于怎麼千變萬化就看大家的了

      适用場景:

        1.當有一個語言需要解釋執行,并且你可将該語言中的句子表示為一個抽象文法樹,可以使用解釋器模式。而當存在以下情況時該模式效果最好

        2.該文法的類層次結構變得龐大而無法管理。此時文法分析程式生成器這樣的工具是最好的選擇。他們無需建構抽象文法樹即可解釋表達式,這樣可以節省空間而且還可能節省時間。

        3.效率不是一個關鍵問題,最高效的解釋器通常不是通過直接解釋文法分析樹實作的,而是首先将他們裝換成另一種形式,例如,正規表達式通常被裝換成狀态機,即使在這種情況下,轉換器仍可用解釋器模式實作,該模式仍是有用的

繼續閱讀