面向對象編程思想-解釋器模式

来源:http://www.cnblogs.com/jdzhang/archive/2017/09/13/7512581.html
-Advertisement-
Play Games

一、引言 我們常常在會在字元串中搜索匹配字元或判斷一個字元串是否符合我們要的格式時,使用正則表達式,可解決問題的背後是一種什麼思想呢?即我們今天要學習的內容,解釋器模式 二、解釋器模式 定義:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子 1.文法:即 ...


一、引言

我們常常在會在字元串中搜索匹配字元或判斷一個字元串是否符合我們要的格式時,使用正則表達式,可解決問題的背後是一種什麼思想呢?即我們今天要學習的內容,解釋器模式

二、解釋器模式

定義:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子

1.文法:即語法規則。在解釋器模式中每一個語法都對應一個解釋器對象,用來處理相應的語法規則。它對於擴展、改變文法規則都很方便

2.可以通過抽象語法樹(Abstract Syntax Tree,AST)的圖形方式來直觀的表示語言的構成,每一棵抽象語法樹對應一個語言實例

下麵是解釋器模式的結構圖

下麵是代碼demo:

     abstract class Expression
    {
        public void Interpret(PlayContext context)
        {
            if(context.PlayText.Length==0)
            {
                return;
            }
            else
            {
                string playKey = context.PlayText.Substring(0, 1);
                context.PlayText = context.PlayText.Substring(2);
                double playValue = Convert.ToDouble(context.PlayText.Substring(0, context.PlayText.IndexOf(" ")));
                context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ")+1);
                Excute(playKey, playValue);
            }
        }
        public abstract void Excute(string key,double value);
    }
     class Note : Expression
    {
        public override void Excute(string key, double value)
        {
            string note = "";
            switch (key)
            {
                case "C":
                    note = "1";
                    break;
                case "D":
                    note = "2";
                    break;
                case "E":
                    note = "3";
                    break;
                case "F":
                    note = "4";
                    break;
                case "G":
                    note = "5";
                    break;
                case "A":
                    note = "6";
                    break;
                case "B":
                    note = "7";
                    break;
            }
            Console.Write(note);
        }
    }
    class Scale : Expression
    {
        public override void Excute(string key, double value)
        {
            string scale = "";
            switch (Convert.ToInt32(value))
            {
                case 1:
                    scale = "低音";
                    break;
                case 2:
                    scale = "中音";
                    break;
                case 3:
                    scale = "高音";
                    break;
            }
            Console.Write(scale);
        }
    }
    //演奏內容
    class PlayContext
    {
        //演奏文本
        private string text;
        public string PlayText
        {
            get { return text; }
            set { text = value; }
        }
    }
     class Program
    {
        static void Main(string[] args)
        {
            PlayContext playContext = new PlayContext();
            Console.WriteLine("上海灘");
            playContext.PlayText = "O 1 E 2 C 0.5 D 2 A 5 G 0.5 P 2 P 0.5 O 2 E 2 O 3 C 0.5 E 2 C 1 ";
            Expression expression = null;
            try
            {
                while (playContext.PlayText.Length>0)
                {
                    string str = playContext.PlayText.Substring(0, 1);
                    switch (str)
                    {
                        case "O":
                            expression = new Scale();
                            break;
                        case "C":
                        case "D":
                        case "E":
                        case "F":
                        case "G":
                        case "A":
                        case "B":
                        case "P":
                            expression = new Note();
                            break;
                    }
                    expression.Interpret(playContext);
                }
            }
            catch (Exception ex )
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }
View Code

代碼demo2:

    class ChineseEnglishDict
    {
        private static Dictionary<string, string> _dictionary = new Dictionary<string, string>();
        static ChineseEnglishDict()
        {
            _dictionary.Add("this", "");
            _dictionary.Add("is", "");
            _dictionary.Add("an", "一個");
            _dictionary.Add("apple", "蘋果");
        }
        public static string GetEnglish(string value)
        {
            return _dictionary[value];
        }
    }
    //定義AbstractExpression介面
    interface IExpression
    {
        void Interpret(StringBuilder sb);
    }
    //定義具體的Expression,這裡包括對英文單詞的翻譯和英文句號的翻譯
    class WordExpression : IExpression
    {
        private string _value;
        public WordExpression(string value)
        {
            this._value = value;
        }
        public void Interpret(StringBuilder sb)
        {
            sb.Append(ChineseEnglishDict.GetEnglish(_value.ToLower()));
        }
    }
     //對英文句號的翻譯
    class SymbolExpression : IExpression
    {
        private string _value;
        public SymbolExpression(string value)
        {
            this._value = value;
        }
        public void Interpret(StringBuilder sb)
        {
            switch (_value)
            {
                case ".":
                    sb.Append("");
                    break;
            }
        }
    }
    //將解釋器組合起來包裝,方便外部調用
    public static class Translator
    {
        public static string Translate(string sentense)
        {
            StringBuilder sb = new StringBuilder();
            IList<IExpression> expressions = new List<IExpression>();
            string[] elements = sentense.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string element in elements)
            {
                string[] words = element.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string word in words)
                {
                    expressions.Add(new WordExpression(word));
                }
                expressions.Add(new SymbolExpression("."));
            }
            foreach (IExpression expression in expressions)
            {
                expression.Interpret(sb);
            }
            return sb.ToString();
        }
    }
     class Program
    {
        static void Main(string[] args)
        {
            string english = "This is an Apple";
            string chinese = Translator.Translate(english);
            Console.WriteLine(chinese);
            Console.Read();
        }
    }
View Code

優點:

1.易於實現文法。一條語法規則用一個解釋器來解釋執行,解釋器只需要考慮這一條語法規則的實現就可以了

2.易於擴展新的語法。可以通過繼承等方式創建相應的解釋器對象

缺點:

1.執行效率低。解釋器模式中使用了大量的迴圈或遞歸調用

2.對於複雜文法難以維護。每一條規則至少需要定義一個類,如果一個語言包含太多的文法規則,類的過程會急劇增加,導致系統難以管理和維護

適用場景:

1.當一個語言需要解釋執行,並可以將語言中的句子表示為一個抽象的語法樹的時候

2.一些重覆出現的問題可以用一種簡單的語言表達

3.一個語言的文法較為簡單

4.當執行效率不是關鍵和主要關心的問題

 

參考:

大話設計模式;

http://www.cnblogs.com/5iedu/p/5595153.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習一門開發語言首先當然是要熟悉它的語法了,Python的語法還算是比較簡單的,這裡從基礎的開始瞭解一下。 標識符1.第一個字元必須是字母表中字母或下劃線’_’。2.標識符的其他的部分有字母、數字和下劃線組成。3.標識符對大小寫敏感。 保留字保留字就是關鍵字,不能用它們做任何標識符。Python里通 ...
  • Python開發環境配置好了,但發現自帶的代碼編輯器貌似用著有點不大習慣啊,所以咱們就找一個“好用的”代碼編輯器吧,網上搜了一下資料,Python常用的編輯器有如下一些: 1. Sublime Text2. Vim3. PyScripter4. PyCharm5. Eclipse with PyDe ...
  • 這次的學習以一個簡單的Student Demo為示例。 1、代碼: 主程式類DemoApplication.java。 1 package com.julion.demo; 2 3 import org.springframework.boot.SpringApplication; 4 import ...
  • NumPy : Numerical Python,是高性能科學計算和數據分析的基礎包。 部分功能: 大部分數據分析應用關註的功能: ...
  • 描述寫一個程式,找出給出素數範圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就開始寫程式,不仔細看題,咱們為了遏制一下讀題不認真仔細的童鞋,規定,兩個素數相鄰為1的也成為孿生素數。輸入第一行給出N(0 using namespace st... ...
  • 選擇排序是一種非常簡單的排序演算法,從字面意思我們就可以知道,選擇就是從未排序好的序列中選擇出最小(最大)的元素,然後與第 i 趟排序的第 i-1(數組中下標從 0 開始) 個位置的元素進行交換,第 i 個元素之前的序列就是已經排序好的序列。整個排序過程只需要遍歷 n-1 趟便可排好,最後一個元素自動 ...
  • PHP操作實現一個多功能購物網站 一、需要實現的頁面: Index.aspx:瀏覽商品頁面,顯示商品列表,用戶可以點擊“加入購物車“。 ViewCart.aspx:查看購物車頁面,顯示已購買的商品信息,可以點擊“刪除“和“提交添加訂單購買”商品 ViewAccount.aspx:查看個人賬戶餘額 L ...
  • 回到目錄 下麵將介紹以下幾個原則,都是軟體設計里的大哥大,大姐大級別的人物! DRY DRY是Do Not Repeat Yourself的簡稱,不要寫重覆的代碼,可以使用代碼重構里的提取到方法,提取到類來做這事 KISS KISS 是Keep it short and simple 的簡稱。意思是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...