一、什么是解释器模式

定义一个语言,定义一个解析器,解析器解释语言

某种繁复的输入可有一定规律抽象为行为,定义语言,使用解释器将这些语言转换为行为,解释器模式提供了评估语言的语法或表达式的方式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

UML图

AbstractExpression: 抽象表达式,定义一个抽象方法接收输入
TerminalExpression: 实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。
NonterminalExpression:——非终结符表达式,文法中的每条规则对应于一个非终结表达式,具体到我们的例子就是加减法规则分别对应到AddExpression和SubExpression两个类。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
Context:上下文,通常包含各个解释器需要的数据,或是公共的功能。

二、适用场景

当有一个语言需要解释执行,并且你可以把该语言中的句子表示为一个抽象的语法树时,比如正则表达式,比如根据用户输入的公式进行加减乘除四则运算

三、优缺点

优点
扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。
缺点
解释器模式会引起类的膨胀:每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。
解释器模式采用递归调用方法:每个非终结符表达式只关心与自己相关的表达式,每个表达式需要知道最终的结果,它将导致调试非常复杂。
解释器模式使用了大量的循环和递归:效率是一个不容忽视的问题。特别是用于解释一个解析复杂、冗长的语法时,效率是难以忍受的。

四、大话中的例子

输入音阶字符转换成音乐标识,一个演奏文本类,负责收集文本,一个表达式抽象类,负责解析,音符类负责解析音符,音阶类负责解析音阶,在客户端输入音乐文本, 调用一个解析器,使用循环不断剥离文本,直到用尽, 每剥离的部分,判断是音阶还是音符,对应解析。

五、我的例子

using System;namespace InterpreterMode
{class Program{static void Main(string[] args){Context context = new Context("3 SB LC MA SC");Console.WriteLine(context.Request());}}class Context{string text;public string Text { get => text; set => text = value; }public Context(string str){text = str;}AleRamen aleRamen = new Weight();public string Request(){return aleRamen.Interprot(text);}}abstract class AleRamen{public string Interprot(string context){AleRamen aleRamen1 = new Weight();AleRamen aleRamen2 = new Category();int num = 1;string cont = "";string[] strs = context.Split(' ');try{num = Convert.ToInt32(strs[0]);}catch (Exception e){num = 1;}cont += num + "位:";for (int i = 0; i < strs.Length; i++){char[] chars = strs[i].ToCharArray();for (int j = 0; j < chars.Length; j++){cont += aleRamen1.Explain(chars[j]);cont += aleRamen2.Explain(chars[j]);}}return cont;}public abstract string Explain(Char mychar);}class Weight : AleRamen{//  Char[] chars = new Char[] { 'S', 'M', 'L' };public override string Explain(Char mychar){String text = "";switch (mychar){case 'S':text = "小份";break;case 'M':text = "中份";break;case 'L':text = "大份";break;}return text;}}class Category : AleRamen{// Char[] chars = new Char[] { 'A', 'B', 'C' };public override string Explain(Char mychar){String text = "";switch (mychar){case 'A':text = "招牌拉面 ";break;case 'B':text = "豚骨拉面 ";break;case 'C':text = "鱼贝拉面 ";break;}return text;}}}
运行结果


PS:解释器模式一般用不上,一个完整的解析器需要做许多复杂的判断,而那些使用解析器能提高效率的领域,已经有人造好轮子了,我们就不要再瞎折腾。

大话设计模式:解释器模式相关推荐

  1. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  2. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  3. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  4. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  5. 设计模式 | 解释器模式及典型应用

    微信原文:设计模式 | 解释器模式及典型应用 博客原文:设计模式 | 解释器模式及典型应用 本文主要介绍解释器模式,在日常开发中,解释器模式的使用频率比较低 解释器模式 解释器模式(Interpret ...

  6. C++设计模式-解释器模式

    目录 基本概念 代码与实例 基本概念 解释器模式(interpreter):给定一个语言,定义他的文法的一种表示,并定义一个解释器,这个解释器应该使用该表示来解释语言中的句子. 如果一种特定类型的问题 ...

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

    模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题. 解释器模式描述了如何构成一 ...

  8. PHP设计模式——解释器模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 解释器模式:Given a language, define arepresentation for its grammar alon ...

  9. 大话设计模式—命令模式

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该 ...

最新文章

  1. 图文结合!一文搞懂 Redis 常用知识点!
  2. 微信小程序刷新webview页面问题
  3. 阿里云Kubernetes服务 - Service Broker快速入门指南
  4. 金山称清理专家遭微软误杀:正积极协商解决
  5. 将Maven与Ivy集成
  6. arduino uno r3引脚图_Arduino入门: 安装和熟悉Arduino IDE
  7. Caffe机器学习框架
  8. HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解
  9. 资深java面试题及答案整理(一)
  10. 2017年c语言试题,2017年计算机二级C语言试题
  11. C# 读取oracle 中文乱码的解决方案
  12. 【逆向】修改软件标题(基于PE Explorer)
  13. android粘贴,Android复制粘贴到剪贴板
  14. Spring 官方文档(中文翻译)
  15. 西安80转换成北京独立计算机,WGS84经纬度坐标转换为西安80高斯投影坐标.
  16. 对经认定的黄浦区区级企业技术中心给予每家30万元奖励
  17. 52单片机课程设计——利用52单片机的智能窗帘设计论文+源码
  18. 机器学习与算法(12)--最小角回归(LARS)
  19. 内存屏障什么的(经典)
  20. Unity双相机Camera,将虚拟相机视角画面显示在平面Plane上

热门文章

  1. 风云收到微软正版Windows7正式旗舰版DVD光盘
  2. 安装Red Giant Maxon App时提示错误11025:无法连接到Red Giant服务
  3. python医疗系统设计_医疗保险信息管理系统的设计与实现.doc
  4. JAVA中面向对象基础:抽象类、初始化块
  5. MySQL Group Replication 学习(部署篇)
  6. 华为宣布:免费培养2000名VUEH5开发者!
  7. autoCAD制图技巧:[弹簧
  8. 【vue】解决跨域问题的原理
  9. Vue搭建项目:ESLint: clear(vue/comment-directive)
  10. 【新征程-ssm】3、mybatis的使用