今天咱們來說解釋器模式【Interpreter Pattern】,如何理解這一個模式呢?一個簡單的例子、中英文翻譯器這個東西的做用是啥呢?將不知道的英文翻譯成中文以便於理解、或者把中文翻譯成英文來使用。其中目的也就是將語言進行翻譯解釋方便去理解使用。那麼解釋器模式呢?也有類似的邏輯、該模式實現了一個表達式接口、該接口解釋一個特定的上下文。主要對於一些固定文法構建一個解釋句子的解釋器。html
在軟件系統中,若是有一些特殊的領域問題較爲複雜,疑似的模式不斷重複出現。這樣使用通常的編程方式會使程序編碼極爲頻繁。在這樣的狀況下,將這種特定的領域的問題轉換表達爲某種語法規則的句子。構建一個解釋器來解釋這樣的句子、從而能夠達到解決問題的目的。正則表達式
給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子。編程
看上面的案例圖,咱們一塊兒看下其中包含的五個部份內容:設計模式
抽象表達式:定義解釋器接口、約定的操做。其中Interpret接口專門用來實現解釋器的功能bash
終結符表達式:實現抽象表達式要求的接口、文法中每個終結符都有其對應的具體終結表達式。ide
非終結表達式:文法中每個規則都須要一個具體的非終結符表達式、通常表示文法中的運算符或者一些關鍵字。ui
上下文類:這個角色用來存放終結符對應的具體的位置。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種設計模式。咱們能夠經過這個系列開頭的文章進行一個總體的回顧。
用愛生活,你會使本身幸福!用愛工做,你會使不少人幸福!
歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!