一,C#设计模式:解释器模式(Interpreter Pattern)

1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用解释器模式
2,解释器设计模式每个解释的类有自己的规则,并且与其他业务规则不冲突

二,如下代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace _23.解释器模式
  8. {
  9. /// <summary>
  10. /// Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
  11. /// 1、当一个语言需要解释执行,并可以将该语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式(如XML文档解释、正则表达式等领域)
  12. /// 2、一些重复出现的问题可以用一种简单的语言来进行表达。
  13. /// 3、一个语言的文法较为简单.
  14. /// 4、当执行效率不是关键和主要关心的问题时可考虑解释器模式(注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。)
  15. /// </summary>
  16. class Program
  17. {
  18. static void Main(string[] args)
  19. {
  20. Context context = new Context("usachi");
  21. List<PeopleInterpreter> interpreterList = new List<PeopleInterpreter>()
  22. {
  23. new Chinese(),
  24. new Usa(),
  25. };
  26. foreach (var item in interpreterList)
  27. {
  28. item.Conversion(context);
  29. }
  30. Console.WriteLine(context.Get());
  31. }
  32. }
  33.  
  34. /// <summary>
  35. /// 上下文
  36. /// </summary>
  37. public class Context
  38. {
  39. private string _Word = null;
  40. public Context(string word)
  41. {
  42. this._Word = word;
  43. }
  44.  
  45. public void Set(string newWord)
  46. {
  47. this._Word = newWord;
  48. }
  49.  
  50. public string Get()
  51. {
  52. return this._Word;
  53. }
  54. }
  55.  
  56. /// <summary>
  57. /// 抽象解释器
  58. /// </summary>
  59. public abstract class PeopleInterpreter
  60. {
  61. public abstract void Conversion(Context context);
  62. }
  63. /// <summary>
  64. /// 中国人业务
  65. /// </summary>
  66. public class Chinese : PeopleInterpreter
  67. {
  68. private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>();
  69. /// <summary>
  70. /// 中国人自己解释规则
  71. /// </summary>
  72. static Chinese()
  73. {
  74. _Dictionary.Add('c', "中国人");
  75. _Dictionary.Add('h', "用");
  76. _Dictionary.Add('i', "筷子吃饭");
  77. }
  78. /// <summary>
  79. /// 中国人解释输入的文案
  80. /// 然后返回解释的文案
  81. /// </summary>
  82. /// <param name="context"></param>
  83. public override void Conversion(Context context)
  84. {
  85. Console.WriteLine(this.GetType().ToString() + "业务");
  86. string text = context.Get();
  87. if (string.IsNullOrEmpty(text))
  88. return;
  89. List<string> numberList = new List<string>();
  90. foreach (var item in text.ToLower().ToArray())
  91. {
  92. if (_Dictionary.ContainsKey(item))
  93. {
  94. numberList.Add(_Dictionary[item]);
  95. }
  96. else
  97. {
  98. numberList.Add(item.ToString());
  99. }
  100. }
  101. context.Set(string.Concat(numberList));
  102. }
  103. }
  104. /// <summary>
  105. /// 美国人业务
  106. /// </summary>
  107. public class Usa : PeopleInterpreter
  108. {
  109. private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>();
  110. /// <summary>
  111. /// 美国人自己解释规则
  112. /// </summary>
  113. static Usa()
  114. {
  115. _Dictionary.Add('u', "美国人");
  116. _Dictionary.Add('s', "用刀叉");
  117. _Dictionary.Add('a', "吃饭,");
  118. }
  119.  
  120. /// <summary>
  121. /// 美国人解释输入的文案
  122. /// 然后返回解释的文案
  123. /// </summary>
  124. /// <param name="context"></param>
  125. public override void Conversion(Context context)
  126. {
  127. Console.WriteLine(this.GetType().ToString() + "业务");
  128. string text = context.Get();
  129. if (string.IsNullOrEmpty(text))
  130. return;
  131. List<string> numberList = new List<string>();
  132. foreach (var item in text.ToLower().ToArray())
  133. {
  134. if (_Dictionary.ContainsKey(item))
  135. {
  136. numberList.Add(_Dictionary[item]);
  137. }
  138. else
  139. {
  140. numberList.Add(item.ToString());
  141. }
  142. }
  143. context.Set(string.Concat(numberList));
  144. }
  145. }
  146. }

C#设计模式:解释器模式(Interpreter Pattern)的更多相关文章

  1. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  2. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  3. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

  4. javascript设计模式 - 解释器模式(interpreter)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  6. 原始的解释器模式(Interpreter Pattern)

    解释器模式的定义(现实项目中非常少遇到,因此直接理论先...) 解释器模式是一种依照规定语法进行解析的方案,在如今项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解 ...

  7. php解释器模式( interpreter pattern)

    ... <?php /* The interpreter pattern specifies how to evaluate language grammar or expressions. W ...

  8. 设计模式:解释器模式(Interpreter)

    为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...

  9. 十一个行为模式之解释器模式(Interpreter Pattern)

    定义: 定义一个语言的文法,可以使用一个解释器来解释其文法.定义终结符和非终结符的统一接口,并使用抽象对象建立非终结符与其它元素的关联. 结构图: AbstractExpression:抽象表达式类, ...

随机推荐

  1. BZOJ 4517: [Sdoi2016]排列计数 错排 + 组合

    从 $n$ 个数中选 $m$ 个不错排,那就是说 $n-m$ 个数是错排的. 用组合数乘一下就好了. Code: #include <cstdio> #include <algori ...

  2. [BZOJ3812]主旋律:状压DP+容斥原理

    分析 Miskcoo orz 令\(f[S]\)表示使得\(S\)这个点集强连通的方案数. 然后呢?不会了 考虑到将一个有向图SCC缩点后,得到的新图是一个DAG,所以我们可以类比带标号DAG计数的解 ...

  3. Oracle生成ASH报告

    1.ASH (Active SessionHistory) ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件.不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成. v ...

  4. Python 写 ACM 题目的一些技巧

    目录 输入输出 input() 输入 split() 用于输入 strip() 输入清理 print() 输入 sort 排序 输入输出 input() 输入 Python3 中 input() 函数 ...

  5. MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构

    后台线程 1.Master Thread 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread  内存 重做日志在以下三种情况下将重做日志缓存中的内容刷新到 ...

  6. 什么是HOOK功能?

    HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现.这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API.中断服务.IFS和NDIS ...

  7. 七、SpringBoot项目集成JSP以及项目不同启动方式及访问路径配置

    1.创建JSP目录 在src/main目录下创建目录webapp/WEB-INF/jsp用于存放jsp页面,如下图: 然后再改文件夹下面我们创建JSP文件: 大家在使用IDEA 的new菜单创建JSP ...

  8. EDM案例讲解:Mouth foods的EDM邮件营销

    你可能没有听说过Mouth foods,它是一个美味产品的在线市场.作为一个日益增长的企业,他们知道电子邮件的重要性,因为在此之前他们通过电子邮件真正找到了企业品牌中的自我,这就是为什么他们认为电子邮 ...

  9. JS实现数组排序:升序和降序

    如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序.即 a 和 b 是两个将要被比较的元素: 如果 compareFunction(a, b) 小于 0 ,那么 a 会 ...

  10. Django开启https(不用nginx)

    首先安装需要用到的包 pip install django-extensions pip install django-werkzeug-debugger-runserver pip install ...