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

1、概述express

在軟件開發特別是DSL開發中經常須要使用一些相對較複雜的業務語言,若是業務語言使用頻率足夠高,且使用普通的編程模式來實現會致使很是複雜的變化,那麼就能夠考慮使用解釋器模式構建一個解釋器對複雜的業務語言進行翻譯。這種作法雖然效率相對較低,但能夠容許用戶使用自定義的業務語言來處理邏輯,所以在效率不是關鍵問題的場合仍是較爲有用的。編程

2、解釋器模式app

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

AbstractExpression聲明一個爲抽象語法樹中全部節點所共享的解釋接口。this

TerminalExpression表示終結符表達式,實現文法中終結符相關聯的全部解釋操做。spa

NonterminalExpression表示非終結符表達式,實現文法中全部非終結符的解釋操做。翻譯

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

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

3、示例接口

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

中英文對照字典以下。

 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     }
相關文章
相關標籤/搜索