解釋器模式(Interpreter Pattern) :定義語言的文法,而且創建一個解釋器來解釋該語言中的句子,這裏的「語言」意思是使用規定格式和語法的代碼,它是一種類行爲型模式。git
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(); }
結果以下:
解釋器模式的優勢
解釋器模式的缺點
根據代理模式的使用目的,常見的代理模式有如下幾種類型: