通俗易懂设计模式解析——解释器模式

通俗易懂设计模式解析——解释器模式前言 今天我们来讲解释器模式 Interpreter Pattern 如何理解这一个模式呢 一个简单的例子 中英文翻译器这个东西的作用是啥呢 将不知道的英文翻译成中文以便于理解 或者把中文翻译成英文来使用 其中目的也就是将语言进行翻译解释

欢迎大家来到IT世界,在知识的湖畔探索吧!

前言

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

通俗易懂设计模式解析——解释器模式

欢迎大家来到IT世界,在知识的湖畔探索吧!

解释器模式介绍

一、来由

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

通俗易懂设计模式解析——解释器模式

二、意图

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

三、案例图

通俗易懂设计模式解析——解释器模式

四、解释器模式代码示例

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

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

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

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

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

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

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

namespace Interpreter_Pattern { class InterpreterPattern { } ///  /// Context: 环境类 ///  public class Context { private string _statement; public Context(string statement) { this._statement = statement; contextMap.Add("一", 1); contextMap.Add("二", 2); contextMap.Add("三", 3); contextMap.Add("四", 4); contextMap.Add("五", 5); contextMap.Add("六", 6); contextMap.Add("七", 7); contextMap.Add("八", 8); contextMap.Add("九", 9); } public string Statement { get { return this._statement; } set { this._statement = value; } } public Dictionary 
  
    contextMap = new Dictionary 
   
     (); } /// 
     /// AbstractExpression: 抽象表达式 ///  public abstract class AbstractExpression { public abstract void Interpret(Context context); } public class TerminalExpression : AbstractExpression { public override void Interpret(Context context) { if (context.Statement!=null) { foreach (var Key in context.contextMap.Keys) { if (context.Statement.Contains(Key)) { context.Statement= context.Statement.Replace(Key, context.contextMap[Key].ToString());// context.contextMap[Key]); } } } //return context; } } public class NonterminalExpression : AbstractExpression { public override void Interpret(Context context) { if (context.Statement.Contains("加")) { context.Statement= context.Statement.Replace("加","+"); } if (context.Statement.Contains("减")) { context.Statement= context.Statement.Replace("减", "-"); } if (context.Statement.Contains("乘")) { context.Statement= context.Statement.Replace("乘", "*"); } if (context.Statement.Contains("除")) { context.Statement= context.Statement.Replace("除", "/"); } //return context; } } } namespace Interpreter_Pattern { class Program { static void Main(string[] args) { Context context = new Context("三加八加九减二乘五除三"); AbstractExpression abstractExpression = new TerminalExpression(); abstractExpression.Interpret(context); AbstractExpression noabstractExpression = new NonterminalExpression(); noabstractExpression.Interpret(context); Console.WriteLine(context.Statement); } } } 
    
  

欢迎大家来到IT世界,在知识的湖畔探索吧!

通俗易懂设计模式解析——解释器模式

使用场景及优缺点

一、使用场景

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

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

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

二、优点

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

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

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

三、缺点

1、可利用场景少。

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

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

通俗易懂设计模式解析——解释器模式

总结

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


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/79770.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信