设计模式深入学习--Interpreter 解释器模式(行为型模式)
来源:互联网 发布:如何使用淘宝模板 编辑:程序博客网 时间:2024/05/16 11:02
今天我们来介绍下 Interpreter 解释器模式。Interpreter 解释器模式我们能用到的地方有很多,比如我们经常用的金额 用数字转中文字,10000转成中文就是一万。 顾名思义,这个设计模式就是一个解释器,通过你输入的一个类型转成另外一个类型出来,在我们的sql查询数据库里面更加有大量的运用。我们先来看懂下基础代码,然后最后实现一个 我们游戏中的中英文切换功能。
class Context{ private string input; public string Input { get { return input; } set { input = value; } } private string output; public string Output { get { return output; } set { output = value; } }}abstract class AbstractExpression{ public abstract void Interpret(Context context);} class TerminalExpression : AbstractExpression{ public override void Interpret(Context context) { Console.WriteLine("终端解释器"); }} class NonterminalExpression : AbstractExpression{ public override void Interpret(Context context) { Console.WriteLine("非终端解释器"); }}首先我们定义一个Context的内容类,装有input 和output两个内容。然后是一个虚拟翻译类AbstractExpression。 里面有一个虚拟方法,可以传入一个Context。最后是两个实体翻译类TerminalExpression类和NonterminalExpression类,都是实际操作的翻译类,这时各自都输出一句话示意。再来看实现:
Context context = new Context(); List<AbstractExpression> lists = new List<AbstractExpression>(); lists.Add(new TerminalExpression()); lists.Add(new NonterminalExpression()); lists.Add(new TerminalExpression()); lists.Add(new TerminalExpression()); foreach (AbstractExpression exp in lists) { exp.Interpret(context); }
新new一个contex内容类,一个虚拟翻译AbstractExpression表单,然后添加实体翻译类,最后循环调用:Interpret输出。
基本的逻辑框架就是这样,是不是非常简单呢,好 现在我们再来升华下内容,做一个我们玩游戏中经常会有一个中英文切换功能。
/// <summary>/// 中英文翻译对照字典/// </summary>public static class ChineseToEnglishDict{ private static Dictionary<string,string> _dictory=new Dictionary<string, string>(); static ChineseToEnglishDict() { _dictory.Add("friends", "好友"); _dictory.Add("backpack", "背包"); _dictory.Add("skills", "技能"); _dictory.Add("community", "社区"); _dictory.Add("activities ", "活动"); _dictory.Add("tools", "工具"); _dictory.Add("other ", "其他"); } public static string GetChinese(string value) { if (_dictory.ContainsKey(value)) { return _dictory[value]; } return value; } public static string GetEnglish(string value) { foreach (var kv in _dictory) { if (kv.Value == value) { return kv.Key; } } Console.WriteLine("字典没有找到对应字符"); return null; } } /// <summary>/// 定义AbstractExpression接口/// </summary>public interface IExpressions{ void Interpret(StringBuilder sb);} /// <summary>/// 英文转中文/// </summary>public class EnglishWordExpression : IExpressions{ private string Value; public EnglishWordExpression(string value) { Value = value; } public void Interpret(StringBuilder sb) { sb.Append(ChineseToEnglishDict.GetChinese(Value.ToLower())); }} /// <summary>/// 中文转英文/// </summary>public class ChineseWordExpression : IExpressions{ private string Value; public ChineseWordExpression(string value) { Value = value; } public void Interpret(StringBuilder sb) { sb.Append(ChineseToEnglishDict.GetEnglish(Value.ToLower())); }} public static class Translators{ public static string EnglishToChinsesTranslator(string sentense) { StringBuilder sb=new StringBuilder(); List<IExpressions> expressions = new List<IExpressions>(); expressions.Add(new EnglishWordExpression(sentense)); foreach (IExpressions e in expressions) { e.Interpret(sb); } return sb.ToString(); } public static string ChinsesToEnglishTranslator(string sentense) { StringBuilder sb = new StringBuilder(); List<IExpressions> expressions = new List<IExpressions>(); expressions.Add(new ChineseWordExpression(sentense)); foreach (IExpressions e in expressions) { e.Interpret(sb); } return sb.ToString(); }}首先实现一个ChineseToEnglishDict 中英文翻译字典类, 里面存放一个字典,存放我们的中英文字典,为了方便,我们也在里面把字典的内容填充好, 其实正确的做法是做两个 中英文的静态表存起来,分别从两个表取。然后里面还有两个方法 中文转英文和英文转中文, 就是从字典的key取value或者value取key。接下来是一个IExpressions 虚拟翻译类,里面的Interpret虚拟方法我用了StringBuilder来代替示例代码的string,毕竟我们是要不断改写内容的。然后 再写两个实体翻译类,一个中转英,一个英转中,就是分别调用中英文翻译字典类的方法而已,最后 一个 静态翻译工具类,里面做的事就是我们在示例代码的实现类似,把重复使用的封装起来,看起来更简洁。好,现在看实现代码:
string english1 = "skills"; string chinese1 = Translators.EnglishToChinsesTranslator(english1); Console.WriteLine(chinese1); string chinese2 = "好友"; string english2 = Translators.ChinsesToEnglishTranslator(chinese2); Console.WriteLine(english2);这里实现代码是不是比示例更加简便了,传入一个需要翻译的字,然后在接收,输出。一气呵成。我们运行下看看结果:
Interpreter 解释器模式的介绍就是以上内容,我们最后再来总结下,解释器模式属于行为模式,Gof是这样定义的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
0 0
- 设计模式深入学习--Interpreter 解释器模式(行为型模式)
- 行为设计模式---解释器模式(Interpreter)
- 设计模式(15)-行为型-解释器模式(Interpreter)
- 设计模式--解释器模式Interpreter(行为型)
- [设计模式-行为型]解释器模式(Interpreter)
- 设计模式(行为型)之解释器模式(Interpreter Pattern)
- 设计模式-行为型- 解释器模式(Interpreter)
- 设计模式(15)--Interpreter(解释器模式)--行为型
- 行为型模式-Interpreter ( 解释器模式 )
- 设计模式-行为设计模式:解释器模式 Interpreter
- [设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(一)
- [设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(二)
- 【设计模式学习笔记十六】【行为模式】【解释器模式(Interpreter)】
- Interpreter解释器(行为型模式)
- 行为型模式-----解释器(Interpreter)
- 行为型模式-解释器interpreter
- 行为型模式-解释器(interpreter)
- 【设计模式】行为模式之解释器Interpreter
- 未完
- ROS问题积累
- poj-【2431 Expedition】
- Python学习,Day3
- Bootstrap表格样式使用方法
- 设计模式深入学习--Interpreter 解释器模式(行为型模式)
- HTML5与移动端web学习笔记
- Android编程至高武学之《如来神掌》第三式~佛动山河
- PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用
- 【数据库原理】索引简介
- 39、Power Query-Text.Combine函数应用
- Bootstrap按钮元素使用方法
- S/4 HANA – 是ERP皇帝的新装,还是SAP王国的新基石
- Java中无参无返回值方法的使用