通俗易懂設計模式解析——解釋器模式

前言

  今天咱們來說解釋器模式【Interpreter Pattern】,如何理解這一個模式呢?一個簡單的例子、中英文翻譯器這個東西的做用是啥呢?將不知道的英文翻譯成中文以便於理解、或者把中文翻譯成英文來使用。其中目的也就是將語言進行翻譯解釋方便去理解使用。那麼解釋器模式呢?也有類似的邏輯、該模式實現了一個表達式接口、該接口解釋一個特定的上下文。主要對於一些固定文法構建一個解釋句子的解釋器。html

解釋器模式介紹

1、來由

  在軟件系統中,若是有一些特殊的領域問題較爲複雜,疑似的模式不斷重複出現。這樣使用通常的編程方式會使程序編碼極爲頻繁。在這樣的狀況下,將這種特定的領域的問題轉換表達爲某種語法規則的句子。構建一個解釋器來解釋這樣的句子、從而能夠達到解決問題的目的。正則表達式

2、意圖

  給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子。編程

3、案例圖

4、解釋器模式代碼示例

看上面的案例圖,咱們一塊兒看下其中包含的五個部份內容:設計模式

抽象表達式:定義解釋器接口、約定的操做。其中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);
        }
    }
}複製代碼

使用場景及優缺點

1、使用場景

一、能夠將一個須要解釋執行的語言中的句子表示爲一個抽象語法樹。

二、一些重複的問題可使用一種簡單的語言進行表達。

三、語言的文法較爲簡單的時候能夠考慮

2、優勢

一、可擴展性高、比較靈活。

二、增長了新的解釋表達式的方式較爲方便。

三、容易實現簡單的文法。

3、缺點

一、可利用場景少。

二、對於複製的文法維護較爲困難。

三、解釋器模式會引發類的膨脹。

總結

  到這裏咱們就看完了解釋器模式,其實咱們仔細想一想正則表達式是否是也有點類似呢?正則表達式也是一個典型的解釋器。解釋器模式也就是給定一個語言,定義表示和解釋器。而後用這個解釋器來解釋語言中的句子。解釋器模式在日常的運用中較少、通常多用於表達式計算或者編譯器、SQL語句解析等。到這裏咱們已經介紹完了23種設計模式。咱們能夠經過這個系列開頭的文章進行一個總體的回顧。

  用愛生活,你會使本身幸福!用愛工做,你會使不少人幸福! 

  歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!

相關文章
相關標籤/搜索