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

前言

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

解释器模式介绍

一、来由

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

二、意图

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

三、案例图

四、解释器模式代码示例

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

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

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

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

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

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

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

namespace Interpreter_Pattern
{
    class InterpreterPattern
    {
    }
    /// <summary>
    /// Context: 环境类
    /// </summary>
    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<string, int> contextMap = new Dictionary<string, int>();

    }

    /// <summary>
    /// AbstractExpression: 抽象表达式
    /// </summary>
    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);
        }
    }
}

使用场景及优缺点

一、使用场景

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

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

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

二、优点

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

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

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

三、缺点

1、可利用场景少。

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

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

总结

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


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

 C#设计模式系列目录

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

(0)

相关推荐

  • 软件设计模式修炼 -- 解释器模式

    解释器是一种不常使用的设计模式,它用于描述如何构成一个简单的语言解释器,主要应用于使用面向对象语言开发的编译器和解释器设计.当我们需要开发一个新的语言时,可以考虑使用解释器模式 模式动机 如果在系统中 ...

  • Sqlite3之Lemon语法解析器初探(1)

    转载请注明出处 看sqlite3源码发现用到了lemon语法解析器 ,然后发现一本好的lemon教程 然后参考里面的例子 做了一些例子. Lemon语法分析器 非常小巧 只依赖于两个文件 . 以下的代 ...

  • 图解Java设计模式之解释器模式

    图解Java设计模式之解释器模式 四则运算问题 传统方案解决四则运算问题分析 解释器模式基本介绍 解释器模式来实现四则 解析器模式在Spring框架中的源码分析 解释器模式的注意事项和细节 四则运算问 ...

  • 简说设计模式——解释器模式

    一.什么是解释器模式 解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树.诸如此类 ...

  • 通俗易懂设计模式解析——中介者模式

    前言 今天我们一起看看中介者模式,怎么去理解这个模式呢?说起来也简单.好理解.生活中我们租房经常都是通过中介来实现的.一般租房要么是房东直租要么是中介.那么今天要讲的中介者模式和租房的这个中介是否有关 ...

  • 设计模式之模板方法模式实战解析

    本文微信公众号「AndroidTraveler」首发. 背景 最近在看<设计模式之禅>,为了能够更加深入的理解设计模式,达到学以致用. 这边记录一下自己的一些感受和看法,并结合具体代码实战 ...

  • 图层模式,用实例解析图层模式在实际操作当中的运用

    本篇教程通过实例来讲解一下图层混合模式的使用技巧,想要透彻的明白和运用图层模式进行修图并不是一朝一夕,看几篇教程,几本书就能学会的,需要我们不断的练习,只有实战才能学会,很多时候我们都是不想去动手练习 ...

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • 深度解析免费模式(九)

    看一下海航的商业模式.海航最初的注册资本只有1000万,但是它在短短的时间,拥有了大批的飞机,控股的航空公司超过十家,并形成了自己的产业生态圈,成为了综合性投资财团.所有成功的秘诀都是金融思维. 最后 ...

  • 设计模式-装饰器模式

    装饰器模式 定义 装饰器模式也叫包装模式 在不改变原有对象的基础上,把功能附加到对象上,提供了比继承更有弹性的替代方案 能够扩展原有对象的功能 属于结构型模式 生活中的例子 买煎饼 我们煎饼可以加鸡蛋 ...