今天咱們來說解釋器模式【Interpreter Pattern】,如何理解這一個模式呢?一個簡單的例子、中英文翻譯器這個東西的做用是啥呢?將不知道的英文翻譯成中文以便於理解、或者把中文翻譯成英文來使用。其中目的也就是將語言進行翻譯解釋方便去理解使用。那麼解釋器模式呢?也有類似的邏輯、該模式實現了一個表達式接口、該接口解釋一個特定的上下文。主要對於一些固定文法構建一個解釋句子的解釋器。html
在軟件系統中,若是有一些特殊的領域問題較爲複雜,疑似的模式不斷重複出現。這樣使用通常的編程方式會使程序編碼極爲頻繁。在這樣的狀況下,將這種特定的領域的問題轉換表達爲某種語法規則的句子。構建一個解釋器來解釋這樣的句子、從而能夠達到解決問題的目的。正則表達式
給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子。編程
看上面的案例圖,咱們一塊兒看下其中包含的五個部份內容:設計模式
抽象表達式:定義解釋器接口、約定的操做。其中Interpret接口專門用來實現解釋器的功能ide
終結符表達式:實現抽象表達式要求的接口、文法中每個終結符都有其對應的具體終結表達式。this
非終結表達式:文法中每個規則都須要一個具體的非終結符表達式、通常表示文法中的運算符或者一些關鍵字。編碼
上下文類:這個角色用來存放終結符對應的具體的位置。spa
客戶端:指使用解釋器的客戶端。翻譯
咱們看看這麼一個案例,在平常的程序開發中偶爾會遇到中文轉阿拉伯數字。對於一些運算須要中文轉數字計算。咱們看看這一問題如何解決吧:設計
namespace Interpreter_Pattern { class InterpreterPattern { } /// <summary> /// Context: 環境類 /// </summary> public class Context { private string _statement; public Context(string statement) { this._statement = statement; contextMap.Add("一", 1); contextMap.Add("二", 2); contextMap.Add("三", 3); contextMap.Add("四", 4); contextMap.Add("五", 5); contextMap.Add("六", 6); contextMap.Add("七", 7); contextMap.Add("八", 8); contextMap.Add("九", 9); } public string Statement { get { return this._statement; } set { this._statement = value; } } public Dictionary<string, int> contextMap = new Dictionary<string, int>(); } /// <summary> /// AbstractExpression: 抽象表達式 /// </summary> public abstract class AbstractExpression { public abstract void Interpret(Context context); } public class TerminalExpression : AbstractExpression { public override void Interpret(Context context) { if (context.Statement!=null) { foreach (var Key in context.contextMap.Keys) { if (context.Statement.Contains(Key)) { context.Statement= context.Statement.Replace(Key, context.contextMap[Key].ToString());// context.contextMap[Key]); } } } //return context; } } public class NonterminalExpression : AbstractExpression { public override void Interpret(Context context) { if (context.Statement.Contains("加")) { context.Statement= context.Statement.Replace("加","+"); } if (context.Statement.Contains("減")) { context.Statement= context.Statement.Replace("減", "-"); } if (context.Statement.Contains("乘")) { context.Statement= context.Statement.Replace("乘", "*"); } if (context.Statement.Contains("除")) { context.Statement= context.Statement.Replace("除", "/"); } //return context; } } }
namespace Interpreter_Pattern { class Program { static void Main(string[] args) { Context context = new Context("三加八加九減二乘五除三"); AbstractExpression abstractExpression = new TerminalExpression(); abstractExpression.Interpret(context); AbstractExpression noabstractExpression = new NonterminalExpression(); noabstractExpression.Interpret(context); Console.WriteLine(context.Statement); } } }
一、能夠將一個須要解釋執行的語言中的句子表示爲一個抽象語法樹。
二、一些重複的問題可使用一種簡單的語言進行表達。
三、語言的文法較爲簡單的時候能夠考慮
一、可擴展性高、比較靈活。
二、增長了新的解釋表達式的方式較爲方便。
三、容易實現簡單的文法。
一、可利用場景少。
二、對於複製的文法維護較爲困難。
三、解釋器模式會引發類的膨脹。
到這裏咱們就看完了解釋器模式,其實咱們仔細想一想正則表達式是否是也有點類似呢?正則表達式也是一個典型的解釋器。解釋器模式也就是給定一個語言,定義表示和解釋器。而後用這個解釋器來解釋語言中的句子。解釋器模式在日常的運用中較少、通常多用於表達式計算或者編譯器、SQL語句解析等。到這裏咱們已經介紹完了23種設計模式。咱們能夠經過這個系列開頭的文章進行一個總體的回顧。
用愛生活,你會使本身幸福!用愛工做,你會使不少人幸福!
歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!