经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
通俗易懂设计模式解析——解释器模式
来源:cnblogs  作者:小世界的野孩子  时间:2019/10/29 12:15:40  对本文有异议

前言

  今天我们来讲解释器模式【Interpreter Pattern】,如何理解这一个模式呢?一个简单的例子、中英文翻译器这个东西的作用是啥呢?将不知道的英文翻译成中文以便于理解、或者把中文翻译成英文来使用。其中目的也就是将语言进行翻译解释方便去理解使用。那么解释器模式呢?也有相似的逻辑、该模式实现了一个表达式接口、该接口解释一个特定的上下文。主要对于一些固定文法构建一个解释句子的解释器。

解释器模式介绍

一、来由

  在软件系统中,如果有一些特殊的领域问题较为复杂,疑似的模式不断重复出现。这样使用一般的编程方式会使程序编码极为频繁。在这样的情况下,将这种特定的领域的问题转换表达为某种语法规则的句子。构建一个解释器来解释这样的句子、从而可以达到解决问题的目的。

二、意图

  给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

三、案例图

 

四、解释器模式代码示例

看上面的案例图,我们一起看下其中包含的五个部分内容:

抽象表达式:定义解释器接口、约定的操作。其中Interpret接口专门用来实现解释器的功能

终结符表达式:实现抽象表达式要求的接口、文法中每一个终结符都有其对应的具体终结表达式。

非终结表达式:文法中每一个规则都需要一个具体的非终结符表达式、一般表示文法中的运算符或者一些关键字。

上下文类:这个角色用来存放终结符对应的具体的位置。

客户端:指使用解释器的客户端。

我们看看这么一个案例,在日常的程序开发中偶尔会遇到中文转阿拉伯数字。对于一些运算需要中文转数字计算。我们看看这一问题如何解决吧:

 

  1. namespace Interpreter_Pattern
  2. {
  3. class InterpreterPattern
  4. {
  5. }
  6. /// <summary>
  7. /// Context: 环境类
  8. /// </summary>
  9. public class Context
  10. {
  11. private string _statement;
  12. public Context(string statement)
  13. {
  14. this._statement = statement;
  15. contextMap.Add("", 1);
  16. contextMap.Add("", 2);
  17. contextMap.Add("", 3);
  18. contextMap.Add("", 4);
  19. contextMap.Add("", 5);
  20. contextMap.Add("", 6);
  21. contextMap.Add("", 7);
  22. contextMap.Add("", 8);
  23. contextMap.Add("", 9);
  24. }
  25. public string Statement
  26. {
  27. get { return this._statement; }
  28. set { this._statement = value; }
  29. }
  30. public Dictionary<string, int> contextMap = new Dictionary<string, int>();
  31. }
  32. /// <summary>
  33. /// AbstractExpression: 抽象表达式
  34. /// </summary>
  35. public abstract class AbstractExpression
  36. {
  37. public abstract void Interpret(Context context);
  38. }
  39. public class TerminalExpression : AbstractExpression
  40. {
  41. public override void Interpret(Context context)
  42. {
  43. if (context.Statement!=null)
  44. {
  45. foreach (var Key in context.contextMap.Keys)
  46. {
  47. if (context.Statement.Contains(Key))
  48. {
  49. context.Statement= context.Statement.Replace(Key, context.contextMap[Key].ToString());// context.contextMap[Key]);
  50. }
  51. }
  52. }
  53. //return context;
  54. }
  55. }
  56. public class NonterminalExpression : AbstractExpression
  57. {
  58. public override void Interpret(Context context)
  59. {
  60. if (context.Statement.Contains(""))
  61. {
  62. context.Statement= context.Statement.Replace("","+");
  63. }
  64. if (context.Statement.Contains(""))
  65. {
  66. context.Statement= context.Statement.Replace("", "-");
  67. }
  68. if (context.Statement.Contains(""))
  69. {
  70. context.Statement= context.Statement.Replace("", "*");
  71. }
  72. if (context.Statement.Contains(""))
  73. {
  74. context.Statement= context.Statement.Replace("", "/");
  75. }
  76. //return context;
  77. }
  78. }
  79. }

 

  1. namespace Interpreter_Pattern
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. Context context = new Context("三加八加九减二乘五除三");
  8. AbstractExpression abstractExpression = new TerminalExpression();
  9. abstractExpression.Interpret(context);
  10. AbstractExpression noabstractExpression = new NonterminalExpression();
  11. noabstractExpression.Interpret(context);
  12. Console.WriteLine(context.Statement);
  13. }
  14. }
  15. }

使用场景及优缺点

一、使用场景

1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。

2、一些重复的问题可以使用一种简单的语言进行表达。

3、语言的文法较为简单的时候可以考虑

二、优点

1、可扩展性高、比较灵活。

2、增加了新的解释表达式的方式较为方便。

3、容易实现简单的文法。

三、缺点

1、可利用场景少。

2、对于复制的文法维护较为困难。

3、解释器模式会引起类的膨胀。

总结

  到这里我们就看完了解释器模式,其实我们仔细想想正则表达式是不是也有点相似呢?正则表达式也是一个典型的解释器。解释器模式也就是给定一个语言,定义表示和解释器。然后用这个解释器来解释语言中的句子。解释器模式在平常的运用中较少、一般多用于表达式计算或者编译器、SQL语句解析等。到这里我们已经介绍完了23种设计模式。我们可以通过这个系列开头的文章进行一个整体的回顾。

 


  用爱生活,你会使自己幸福!用爱工作,你会使很多人幸福!

   C#设计模式系列目录

   欢迎大家扫描下方二维码,和我一起踏上设计模式的闯关之路吧!

 

 

原文链接:http://www.cnblogs.com/hulizhong/p/11757744.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号