• 北风设计模式课程---解释器模式(Interpreter Pattern)


    北风设计模式课程---解释器模式(Interpreter Pattern)

    一、总结

    一句话总结:

    不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例
    设计模式都是对生活的抽象,比如用户获得装备,我可以先装备工厂先生产出来装备,然后给宗门武器库,宗门武器库发给我,如果是打怪获得的装备,可以是装备工厂把装备给的怪物装备库

    1、解释器模式的应用场景?

    面向对象语言开发的编译器中:解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。
    某一特定类型的问题发生的频率很高:如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句

    2、解释器模式 定义?

    定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式。

    3、抽象语法树 是什么?

    表达式二叉树:除了使用文法规则来定义一个语言,在解释器模式中还可以通过一种称之为抽象语法树(Abstract Syntax Tree, AST)的图形方式来直观地表示语言的构成,每一棵抽象语法树对应一个语言实例。

    二、深入浅出设计模式——解释器模式(Interpreter Pattern)

    转自或参考:深入浅出设计模式——解释器模式(Interpreter Pattern)
    https://www.cnblogs.com/Bobby0322/p/4195555.html

    模式动机

    如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题。
    解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。

    模式定义
    解释器模式(Interpreter Pattern) :定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式。
    Interpreter Pattern: Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
    Frequency of use: low
    UML图

    模式结构
    解释器模式包含如下角色:
    AbstractExpression: 抽象表达式
    TerminalExpression: 终结符表达式
    NonterminalExpression: 非终结符表达式
    Context: 环境类
    Client: 客户类

    模式分析
    解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。
    文法规则实例:
    expression ::= value | symbol
    symbol ::= expression '+' expression | expression '-' expression
    value ::= an integer //一个整数值
    在文法规则定义中可以使用一些符号来表示不同的含义,如使用“|”表示或,使用“{”和“}”表示组合,使用“*”表示出现0次或多次等,其中使用频率最高的符号是表示或关系的“|” 。

    抽象语法树:
    除了使用文法规则来定义一个语言,在解释器模式中还可以通过一种称之为抽象语法树(Abstract Syntax Tree, AST)的图形方式来直观地表示语言的构成,每一棵抽象语法树对应一个语言实例。

    抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。
    在解释器模式中,每一种终结符和非终结符都有一个具体类与之对应,正因为使用类来表示每一个语法规则,使得系统具有较好的扩展性和灵活性。

    模式实例与解析
    以中英文翻译系统为例来介绍解释器模式
    体系结构

    AbstractExpression接口 IExpression.cs

    using System.Text;
    
    namespace InterpreterPattern
    {
        //定义AbstractExpression接口
        interface IExpression
        {
            void Interpret(StringBuilder sb);
        }
    }

    具体的Expression WordExpression.cs

    using System.Text;
    
    namespace InterpreterPattern
    {
        //定义具体的Expression,这里包括对英文单词的翻译和对英文句号的翻译。
        public class WordExpression : IExpression
        {
            private string _value;
            public WordExpression(string value)
            {
                _value = value;
            }
            public void Interpret(StringBuilder sb)
            {
                sb.Append(ChineseEnglishDict.GetEnglish(_value.ToLower()));
            }
        }
    }

    SymbolExpression.cs

    using System.Text;
    
    namespace InterpreterPattern
    {
        //对英文句号的翻译
        public class SymbolExpression : IExpression
        {
            private string _value;
            public SymbolExpression(string value)
            {
                this._value = value;
            }
    
            public void Interpret(StringBuilder sb)
            {
                switch (_value)
                {
                    case ".":
                        sb.Append("");
                        break;
                }
            }
        }
    }

    Context: 环境类 ChineseEnglishDict.cs

    using System.Collections.Generic;
    
    namespace InterpreterPattern
    {
        public static class ChineseEnglishDict
        {
            private static Dictionary<string, string> _dictory = new Dictionary<string, string>();
    
            static ChineseEnglishDict()
            {
                _dictory.Add("this", "");
                _dictory.Add("is", "");
                _dictory.Add("an", "一个");
                _dictory.Add("apple", "苹果");
            }
            public static string GetEnglish(string value)
            {
                return _dictory[value];
            }
        }
    }

    将各部分解释器组合起来进行包装,方便用户调用 Translator.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace InterpreterPattern
    {
        //将各部分解释器组合起来进行包装,方便用户调用。
        public static class Translator
        {
            public static string Translate(string sentense)
            {
                StringBuilder sb = new StringBuilder();
                List<IExpression> expressions = new List<IExpression>();
                string[] elements = sentense.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string element in elements)
                {
                    string[] words = element.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (string word in words)
                    {
                        expressions.Add(new WordExpression(word));
                    }
                    expressions.Add(new SymbolExpression("."));
                }
                foreach (IExpression expression in expressions)
                {
                    expression.Interpret(sb);
                }                
                return sb.ToString();
            }
        }
    }

    Client:客户类

    using System;
    
    namespace InterpreterPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                string englist = "This is an apple.";
                string chinese = Translator.Translate(englist);
                Console.WriteLine(chinese);
                Console.Read();
            }
        }
    }

    模式优缺点
    解释器模式的优点
    易于改变和扩展文法。
    易于实现文法。
    增加了新的解释表达式的方式。
    解释器模式的缺点
    对于复杂文法难以维护。
    执行效率较低。
    应用场景很有限。

    模式适用环境
    在以下情况下可以使用解释器模式:
    可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
    一些重复出现的问题可以用一种简单的语言来进行表达。
    文法较为简单。
    效率不是关键问题。

    【声明与感谢】
    本文,站在许多巨人的肩膀上,借鉴和引用了许多他人拥有版权的作品或著述,在此,对前人们的贡献致谢。并同时公布引用的内容、原作者或来源(一些来源于互联网的内容本人无法追述本源,深表遗憾)。

    【参考文献】
    《设计模式—可复用面向对象软件的基础》作者: [美] Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 / 刘建中 等 机械工业出版社
    《重构—改善既有代码的设计》作者: Martin Fowler译者:候捷 中国电力出版社
    《敏捷软件开发—原则、模式与实践》作者: Robert C. Martin 清华大学出版社
    《程序员修炼之道—从小工到专家》作者: Andrew Hunt / David Thomas 电子工业出版社
    《Head First 设计模式》作者: 弗里曼 译者: O'Reilly Taiwan公司 中国电力出版社
    《设计模式之禅》 作者: 秦小波 机械工业出版社
    MSDN WebCast 《C#面向对象设计模式纵横谈》 讲师:李建忠
    刘伟. 设计模式. 北京:清华大学出版社, 2011.
    刘伟. 设计模式实训教程. 北京:清华大学出版社, 2012.
    《大话设计模式》 作者: 程杰 清华大学出版社
    《C#图解教程》作者: 索利斯 译者: 苏林 / 朱晔 人民邮电出版社
    《你必须知道的.NET》作者: 王涛
    《项目中的.NET》作者: 李天平 电子工业出版社
    《Microsoft .NET企业级应用架构设计》作者: (美)埃斯波西托等编著 译者: 陈黎夫
    http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
    http://www.cnblogs.com/zhenyulu 博客作者:吕震宇
    http://www.cnblogs.com/terrylee 博客作者:李会军
    http://www.cnblogs.com/anlyren/ 博客作者:anlyren
    http://www.cnblogs.com/idior 博客作者:idior
    http://www.cnblogs.com/allenlooplee 博客作者:Allen lee
    http://blog.csdn.net/ai92 博客作者:ai92
    http://www.cnblogs.com/umlonline/ 博客作者:张传波
    http://www.cnblogs.com/lovecherry/ 博客作者:LoveCherry

     
  • 相关阅读:
    luogu3242 接水果 (整体二分+树状数组)
    [BZOJ3449] [Usaco2014 Feb]Secret Code
    [BZOJ2821] 作诗(Poetize)
    [BZOJ2434] [Noi2011]阿狸的打字机
    [BZOJ1212] [HNOI2004]L语言
    [JZOJ100026]【NOIP2017提高A组模拟7.7】图
    [BZOJ2467] [中山市选2010]生成树
    [Luogu3868] [TJOI2009]猜数字
    [POJ1006] Biorhythms
    [BZOJ2733] [HNOI2012]永无乡
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11033159.html
Copyright © 2020-2023  润新知