一,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)); } } }