C#設計模式——解釋器模式(Interpreter Pattern)


一、概述

在軟件開發特別是DSL開發中常常需要使用一些相對較復雜的業務語言,如果業務語言使用頻率足夠高,且使用普通的編程模式來實現會導致非常復雜的變化,那么就可以考慮使用解釋器模式構建一個解釋器對復雜的業務語言進行翻譯。這種做法雖然效率相對較低,但可以允許用戶使用自定義的業務語言來處理邏輯,因此在效率不是關鍵問題的場合還是較為有用的。

二、解釋器模式

解釋器模式描述了如何為簡單的語言定義一個文法,如何在該語言中表示一個句子,以及如何解釋這些句子。其結構圖如下:

AbstractExpression聲明一個為抽象語法樹中所有節點所共享的解釋接口。

TerminalExpression表示終結符表達式,實現文法中終結符相關聯的所有解釋操作。

NonterminalExpression表示非終結符表達式,實現文法中所有非終結符的解釋操作。

Context包含解釋器外的一些全局信息。

Client構建語法樹並調用解釋器。

三、示例

我們我們就以中英文翻譯系統為例來介紹解釋器模式。

中英文對照字典如下。

 1     public static class ChineseEnglishDict
 2     {
 3         private static Dictionary<string, string> _dictory = new Dictionary<string, string>();
 4 
 5         static ChineseEnglishDict()
 6         {
 7             _dictory.Add("this", "");
 8             _dictory.Add("is", "");
 9             _dictory.Add("an", "一個");
10             _dictory.Add("apple", "蘋果");
11         }
12 
13         public static string GetEnglish(string value)
14         {
15             return _dictory[value];
16         }
17     }

首先定義AbstractExpression接口。

1     public interface IExpression
2     {
3         void Interpret(StringBuilder sb);
4     }

接着定義具體的Expression,這里包括對英文單詞的翻譯和對英文句號的翻譯。

 1     public class WordExpression : IExpression
 2     {
 3         private string _value;
 4 
 5         public WordExpression(string value)
 6         {
 7             _value = value;
 8         }
 9 
10         public void Interpret(StringBuilder sb)
11         {
12             sb.Append(ChineseEnglishDict.GetEnglish(_value.ToLower()));
13         }
14     }
15 
16     public class SymbolExpression : IExpression
17     {
18         private string _value;
19 
20         public SymbolExpression(string value)
21         {
22             _value = value;
23         }
24 
25         public void Interpret(StringBuilder sb)
26         {
27             switch (_value)
28             {
29                 case "." :
30                     sb.Append("");
31                     break;
32             }
33         }
34     }

最后將各部分解釋器組合起來進行包裝,方便用戶調用。

 1     public static class Translator
 2     {
 3         public static string Translate(string sentense)
 4         {
 5             StringBuilder sb = new StringBuilder();
 6             List<IExpression> expressions = new List<IExpression>();
 7             string [] elements = sentense.Split(new char [] {'.'}, StringSplitOptions.RemoveEmptyEntries);
 8             foreach (string element in elements)
 9             {
10                 string[] words = element.Split(new char [] {' '}, StringSplitOptions.RemoveEmptyEntries);
11                 foreach (string word in words)
12                 {
13                     expressions.Add(new WordExpression(word));
14                 }
15                 expressions.Add(new SymbolExpression("."));
16             }
17             foreach (IExpression expression in expressions)
18             {
19                 expression.Interpret(sb);
20             }
21             return sb.ToString();
22         }
23     }

讓我們來看一下如何調用解釋器。

1     static void Main(string[] args)
2     {
3         string englist = "This is an apple.";
4         string chinese = Translator.Translate(englist);
5         Console.WriteLine(chinese);
6     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM