C#設計模式:解釋器模式(Interpreter Pattern)

一,C#設計模式:解釋器模式(Interpreter Pattern)正則表達式

1,解釋器模式的應用場合是Interpreter模式應用中的難點,只有知足「業務規則頻繁變化,且相似的模式不斷重複出現,而且容易抽象爲語法規則的問題」才適合使用解釋器模式
2,解釋器設計模式每一個解釋的類有本身的規則,而且與其餘業務規則不衝突設計模式

二,以下代碼ide

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _23.解釋器模式
{
    /// <summary>
    /// Interpreter模式的應用場合是Interpreter模式應用中的難點,只有知足「業務規則頻繁變化,且相似的模式不斷重複出現,而且容易抽象爲語法規則的問題」才適合使用Interpreter模式。
    ///  一、當一個語言須要解釋執行,並能夠將該語言中的句子表示爲一個抽象語法樹的時候,能夠考慮使用解釋器模式(如XML文檔解釋、正則表達式等領域)
    ///  二、一些重複出現的問題能夠用一種簡單的語言來進行表達。
    ///  三、一個語言的文法較爲簡單.
    ///  四、當執行效率不是關鍵和主要關心的問題時可考慮解釋器模式(注:高效的解釋器一般不是經過直接解釋抽象語法樹來實現的,而是須要將它們轉換成其餘形式,使用解釋器模式的執行效率並不高。)
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Context context = new Context("usachi");
            List<PeopleInterpreter> interpreterList = new List<PeopleInterpreter>()
                    {
                        new Chinese(),
                        new Usa(),
                    };
            foreach (var item in interpreterList)
            {
                item.Conversion(context);
            }
            Console.WriteLine(context.Get());
        }
    }

    /// <summary>
    /// 上下文
    /// </summary>
    public class Context
    {
        private string _Word = null;
        public Context(string word)
        {
            this._Word = word;
        }

        public void Set(string newWord)
        {
            this._Word = newWord;
        }

        public string Get()
        {
            return this._Word;
        }
    }

    /// <summary>
    /// 抽象解釋器
    /// </summary>
    public abstract class PeopleInterpreter
    {
        public abstract void Conversion(Context context);
    }
    /// <summary>
    /// 中國人業務
    /// </summary>
    public class Chinese : PeopleInterpreter
    {
        private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>();
        /// <summary>
        /// 中國人本身解釋規則
        /// </summary>
        static Chinese()
        {
            _Dictionary.Add('c', "中國人");
            _Dictionary.Add('h', "");
            _Dictionary.Add('i', "筷子吃飯");
        }
        /// <summary>
        /// 中國人解釋輸入的文案
        /// 而後返回解釋的文案
        /// </summary>
        /// <param name="context"></param>
        public override void Conversion(Context context)
        {
            Console.WriteLine(this.GetType().ToString() + "業務");
            string text = context.Get();
            if (string.IsNullOrEmpty(text))
                return;
            List<string> numberList = new List<string>();
            foreach (var item in text.ToLower().ToArray())
            {
                if (_Dictionary.ContainsKey(item))
                {
                    numberList.Add(_Dictionary[item]);
                }
                else
                {
                    numberList.Add(item.ToString());
                }
            }
            context.Set(string.Concat(numberList));
        }
    }
    /// <summary>
    /// 美國人業務
    /// </summary>
    public class Usa : PeopleInterpreter
    {
        private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>();
        /// <summary>
        /// 美國人本身解釋規則
        /// </summary>
        static Usa()
        {
            _Dictionary.Add('u', "美國人");
            _Dictionary.Add('s', "用刀叉");
            _Dictionary.Add('a', "吃飯,");
        }

        /// <summary>
        /// 美國人解釋輸入的文案
        /// 而後返回解釋的文案
        /// </summary>
        /// <param name="context"></param>
        public override void Conversion(Context context)
        {
            Console.WriteLine(this.GetType().ToString() + "業務");
            string text = context.Get();
            if (string.IsNullOrEmpty(text))
                return;
            List<string> numberList = new List<string>();
            foreach (var item in text.ToLower().ToArray())
            {
                if (_Dictionary.ContainsKey(item))
                {
                    numberList.Add(_Dictionary[item]);
                }
                else
                {
                    numberList.Add(item.ToString());
                }
            }
            context.Set(string.Concat(numberList));
        }
    }
}
相關文章
相關標籤/搜索