Interpreter(解释器) 行为型 1

Intent_意图2

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

Motivation_动机3

对于一些固定方法构建一个解释句子的解释器

Applicability_适用性4

当某种特定类型的问题发性频率足够高,就可值得将该问题的各个实例表述为一个简单语言中的句子。去构建一个解释器,该解释器通过解释这些句子来解决该问题

Structure_结构5

Participants_参与者6

  • AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作
  • TerminalExpression(终结符表达式):抽象表达式的子类,用来实现方法中与终结符相关的操作
  • NonterminalExpression(非终结符表达式):抽象表达式的子类,用来实现方法中与非终结符相关的操作
  • Context(环境):通常包含各个解释器需要的数据或是公共功能
  • Client(客户):调用解释器解释需要分析的句子或表达式

Collaborations_协作7

  1. AbstractExpression定义一个所有的具体表达式都需要实现的抽象接口
    -> 主要包含一个interpret()方法,称做解释器方法
  2. TerminalExpression、NonterminalExpression实现AbstractExpression中所要求的接口
    -> 方法中的每个终结符都有一个具体的TerminalExpression与之相对应
    -> 方法中的每一条规则都需要一个具体的NonterminalExpression与之相对应
    -> 例如公式:R=R1+R2中;R1和R2就是终结符,对应的解释R1和R2的解释器就是TerminalExpression,"+“就是非终结符,对应解释”+"的解释器就是一个NonterminalExpression
  3. Context存放方法中各个终结符所对应的具体数据或公共功能
    -> 例如公式:R=R1+R2中;给R1赋值100,给R2赋值200,这些信息应当存放到Context中
    -> 一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取具体数据
    -> 大多数情况下,使用Map来充当Context就足已
  4. Client将需要分析的句子或表达式,转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法
    -> 也可以通Context间接访问解释器的解释方法

Comsequences_结果8

  • 优点
    可扩展性较好、灵活
    增加了新的解释表达式的方式
    易于实现简单方法
  • 缺点
    可利用场景较少
    对于复杂的文法比较难维护
    解释器模式会引起类膨胀
    解释器模式采用递归调用方法
  • 用途
    可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
    一些重复出现的问题可以用一种简单的语言来进行表达
    一个简单语法需要解释的场景

Implementation/Sample Code_实现/范例代码910

Implementation

Expression

public abstract class AbstractExpression {/***   解释的操作**/public abstract void interpret(Context ctx);
}

TerminalExpression

public class TermianlExpression extends AbstractExpression {public void interpret(Context ctx) {// 实现与语法规则中的终结符相关联的解释操作// TODO}
}

NonterminalExpression

public class NonterminalExpression extends AbstractExpression {private List<AbstractExpression> list = new ArrayList<AbstractExpression>();public void addAbstractEexpression(AbstractExpression ae) {list.add(ae);}public void interpret(Context ctx) {// 实现与语法规则中的非终结符相关联的解释操作// TODO}
}

Context

public class Context {// 公共的属性方法
}

Client

public class Client {// step1:按照语法规则对特定的语句构建抽象语法树// step2:调用解释操作
}

Sample Code

Expression

public abstract class AbstractExpression {public abstract boolean interpret(String context);
}

TerminalExpression

public class TerminalExpression extends AbstractExpression {private Set<String> set = new HashSet<String>();public TerminalExpression(String[] data) {for (int i = 0; i < data.length; i++) {set.add(data[i]);}}// 处理终结符表达式@Overridepublic boolean interpret(String context) {if (set.contains(context.trim())) {return true;}return false;}
}

NonterminalExpression

public class AndExpression extends AbstractExpression {private AbstractExpression consoles = null;private AbstractExpression games = null;public AndExpression(AbstractExpression consoles, AbstractExpression games) {this.consoles = consoles;this.games = games;}// 处理非终结符表达式@Overridepublic boolean interpret(String context) {String s[] = context.split("on");return games.interpret(s[0]) && consoles.interpret(s[1]);}
}

Context

public class Context {private String[] consoles = {"PC", "PS4", "XBOX"};private String[] games = {"Halo", "SEKIRO", "Diablo"};private AbstractExpression expression = null;public Context() {expression = new AndExpression(new TerminalExpression(consoles), new TerminalExpression(games));}// 调用相关表达式类的解释方法public void play(String context) {boolean flag = expression.interpret(context);if (flag) {System.out.println("Now you can play " + context);} else {System.out.println("There is no such game to paly");}}
}

Client

public class Client {public static void main(String[] args) {Context game = new Context();game.play("Diablo on PS4");game.play("Diablo on XBOX");game.play("XCOM on PC");}
}

Result

Now you can play Diablo on PS4
Now you can play Diablo on XBOX
There is no such game to paly

Known Uses_已知应用11

Related Patterns_相关模式12


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

Interpreter(解释器)相关推荐

  1. 熟悉Python Interpreter解释器

    1. 启动python解释器 2. python解释器的两种模式 3. 错误处理 4. 设置python解释器启动代码 5. 执行python module 5.1 python文件注释 5.2 如何 ...

  2. 设计模式之 Interpreter(解释器) 通俗理解

    23种设计模式 1 Interpreter定义: 定义语言的文法 ,并且建立一个解释器来解释该语言中的句子.通俗来讲就是定义一套规则,然后有个工具类,根据你传入的参数就知道你表达的意思. Interp ...

  3. Interpreter解释器模式

    前言: 关于23种设计模式的所有示例代码请参考:https://github.com/Wuchenwcf/MyCode/tree/master/DP 本文所述代码请参考:https://github. ...

  4. 浅谈Interpreter解释器模式

    一.前言 这是我们23个设计模式中最后一个设计模式了,大家或许也没想到吧,竟然是编译原理上的编译器,这样说可能不对,因为编译器分为几个部分组成呢,比如词法分析器.语法分析器.语义分析器.中间代码优化器 ...

  5. Interpreter(解释器模式)行为型

    解释器模式 一.概述 二.结构 三.实例 四.适用场景 五.优缺点 一.概述 描述:当不懂英文的中国人和不懂中文的外国人交流时会存在沟通障碍.这时有种翻译器能将两种语言进行转换各个对方国家语言,然后进 ...

  6. Interpreter解释器(行为型模式)

    动机(Motivation) 在软件构建中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的变成方式来实现将面临非常频繁的变化. 在这种情况下,将特定领域的问题表达为某种语法规则 ...

  7. Interpreter - 解释器模式

    定义 给定一个语言, 定于它的文法,并定义一个解释器,这个解释器使用改表示来解释语言中的句子. 类型 行为型模式 案例 像很熟知的正則表達式就是描写叙述字符串模式的一种标准语言,它为每个模式都构造了一 ...

  8. [转载] C#面向对象设计模式纵横谈——16 Interpreter解释器模式

    主讲:李建忠 来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD. ...

  9. 设计模式之解释器模式(Interpreter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  10. java interpreter_解释器模式(Interpreter)Java

    定义: 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 结构图: AbstractExpression解释器模式 ...

最新文章

  1. php7 ext skel_基于PHP7的PHP扩展开发之一(hello word)
  2. Amazon Aurora 升级, 兼容 PostgreSQL
  3. 围观云栖大会有感:从不“栖”而遇到后会有“栖”
  4. 006商城项目:该项目的路径访问问题
  5. 微信小程序 等待几秒、_微信小程序—setTimeout定时器的坑
  6. 线程锁定CPU linux,linux 线程与CPU绑定
  7. 测试方案和测试计划的区别
  8. springboot security
  9. Unity3d之Http通讯GET方法和POST方法
  10. 中澳科学家在量子安全通信领域合作研究取得突破性进展
  11. linux 内核恐慌,linux – CentOS 6.5 mdadm Raid 1 – raid数据检查期间的内核恐慌
  12. python执行方式及变量
  13. 自己手写WEB程序框架并执行
  14. 使用vue脚手架vue-cli搭建项目
  15. PRML_4章 线性模型分类笔记
  16. 学习JSON的神级网站www.bejson.com
  17. 数字图像处理-基本知识总结
  18. Windows Azure Active Directory (1) 前言 - 基于声明的验证和授权
  19. 小数的二进制与十进制转换
  20. C语言中delay的用法

热门文章

  1. 用户一键登陆,如何实现?了解一下!
  2. Python创建临时文件和文件夹
  3. 夜神模拟器-软件apk存放目录
  4. 揭秘“菲住布渴”中运用的黑科技:除了check in、坐电梯、开门...全部刷脸之外,还有什么?
  5. MongoDB 语法大全
  6. django里template中的书名号
  7. html5页面交互,H5的交互原型设计
  8. php apm,apm是什么?
  9. pygame简易超级玛丽制作
  10. 《徐志摩传》记得也好,最好你忘掉