設計模式之-解釋器模式

定義:

解釋器模式(Interpreter Pattern) :定義語言的文法,而且創建一個解釋器來解釋該語言中的句子,這裏的「語言」意思是使用規定格式和語法的代碼,它是一種類行爲型模式。git

解釋器模式參與者

  • Context:包含解釋器以外的一些全局信息。
  • AbstractExpression:抽象表達式,聲明一個抽象的解釋操做,這個接口爲抽象語法樹中全部的節點共享。
  • TerminalExpression:終結符表達式,實現與文法中的終結符相關聯的解釋操做。
  • NonterminalExpression:非終結符表達式,爲文法中的非終結符實現解釋操做。對文法中的每一條規則R1,R2......Rn,都須要一個具體的非終結符表達式類。

解釋器模式基本代碼

Context類:github

namespace InterpreterPattern.BasicStructure
{
    class Context
    {
        public string Input { get; set; }
        public string Output { get; set; }
    }
}

AbstractExpression類:編程

namespace InterpreterPattern.BasicStructure
{
    abstract class AbstractExpression
    {
        public abstract void Interpret(Context context);
    }
}

TerminalExpression類:app

namespace InterpreterPattern.BasicStructure
{
    class TerminalExpression : AbstractExpression
    {
        public override void Interpret(Context context)
        {
            Console.WriteLine("終端解釋器");
        }
    }
}

NonterminalExpression類:編程語言

namespace InterpreterPattern.BasicStructure
{
    class NonterminalExpression : AbstractExpression
    {
        public override void Interpret(Context context)
        {
            Console.WriteLine("非終端解釋器");
        }
    }
}

客戶端調用代碼:ide

    static void Main(string[] args)
    {
        try
        {
            {//BasicStructure
                Context context = new Context();
                IList<AbstractExpression> list = new List<AbstractExpression>();
                list.Add(new TerminalExpression());
                list.Add(new NonterminalExpression());
                list.Add(new TerminalExpression());
                list.Add(new TerminalExpression());

                foreach (var item in list)
                {
                    item.Interpret(context);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

結果以下:工具

用解釋器模式實現英文翻譯

場景模擬:做爲一個學渣級的存在,讀書時沒有學好英文,如今碰到英文時經常須要藉助一些翻譯工具。ui

ChineseEnglishDict(環境)類——Context類this

namespace InterpreterPattern.SituationSimulation
{
    /// <summary>
    /// 環境類
    /// </summary>
    class ChineseEnglishDict
    {
        private  Dictionary<string, string> _dictory = new Dictionary<string, string>();
   
        public ChineseEnglishDict()
        {
            _dictory.Add("this", "");
            _dictory.Add("is", "");
            _dictory.Add("an", "一個");
            _dictory.Add("apple", "蘋果");
        }

        public string GetEnglish(string value)
        {
            return _dictory[value.ToLower()];
        }
    }
}

TranslateExpression(翻譯抽象)類——AbstractExpression類spa

namespace InterpreterPattern.SituationSimulation
{
    /// <summary>
    /// 翻譯抽象類
    /// </summary>
    abstract class TranslateExpression
    {
        public abstract string Interpret(ChineseEnglishDict context);
    }
}

WordExpression(單詞翻譯)類——NonterminalExpression類

namespace InterpreterPattern.SituationSimulation
{
    /// <summary>
    /// 單詞翻譯類
    /// </summary>
    class WordExpression : TranslateExpression
    {
        private string _value;
        public WordExpression(string value)
        {
            this._value = value;
        }
        public override string Interpret(ChineseEnglishDict dict)
        {
            return new StringBuilder().Append(dict.GetEnglish(_value)).ToString();
        }
    }
}

SymbolExpression(符號翻譯)類——TerminalExpression類

namespace InterpreterPattern.SituationSimulation
{
    /// <summary>
    /// 符號翻譯類
    /// </summary>
    class SymbolExpression : TranslateExpression
    {
        private string _value;
        public SymbolExpression(string value)
        {
            this._value = value;
        }
        public override string Interpret(ChineseEnglishDict dict)
        {
            switch (_value)
            {
                case ".":
                    return new StringBuilder().Append("").ToString();
                default: return _value;
            }
        }
    }
}

客戶端調用代碼:

    static void Main(string[] args)
    {
        try
        {
            {//SituationSimulation
                    IList<TranslateExpression> list = new List<TranslateExpression>();
                    string english = "This is an apple.";
                    var elements = english.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var element in elements)
                    {
                        var words = element.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        foreach (var word in words)
                        {
                            list.Add(new WordExpression(word));
                        }
                        list.Add(new SymbolExpression("."));
                    }
                    ChineseEnglishDict dict = new ChineseEnglishDict();
                    string result = "";
                    foreach (var item in list)
                    {
                        result += item.Interpret(dict);
                    }
                    Console.WriteLine(english + "翻譯後:" + result);
                }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

 

結果以下:

優勢:

解釋器模式的優勢

  • 解釋器是一個簡單的語法分析工具,它最顯著的優勢就是擴展性,修改語法規則只須要修改相應的非終結符就能夠了,若擴展語法,只須要增長非終結符類就能夠了。

缺點:

解釋器模式的缺點

  • 解釋器模式會引發類的膨脹,每一個語法都須要產生一個非終結符表達式,語法規則比較複雜時,就可能產生大量的類文件,爲維護帶來很是多的麻煩。
  • 執行效率較低。
  • 對於複雜的文法比較難維護。

適用環境:

根據代理模式的使用目的,常見的代理模式有如下幾種類型:

  • 能夠將一個須要解釋執行的語言中的句子表示爲一個抽象語法樹。
  • 一些重複出現的問題能夠用一種簡單的語言來進行表達。
  • 文法較爲簡單。
  • 效率不是關鍵問題。

總結:

  • 在解釋器模式中因爲語法是由不少類表示的,因此可擴展性強。
  • 然解釋器的可擴展性強,可是若是語法規則的數目太大的時候,該模式可能就會變得異常複雜。因此解釋器模式適用於文法較爲簡單的。
  • 解釋器模式能夠處理腳本語言和編程語言。經常使用於解決某一特定類型的問題頻繁發生狀況。

源代碼地址:https://github.com/houzhenhuang/DesignPattern

相關文章
相關標籤/搜索