Interpreter(解释器)
Interpreter(解释器) 行为型 类 1
Intent_意图2
给定一个语言,定义它的方法表示 ,并定义一个解释器,这个解释器使用该标识来解释语言中的句子
Motivation_动机3
对于一些固定方法构建一个解释句子的解释器
Applicability_适用性4
当某种特定类型的问题发性频率足够高,就可值得将该问题的各个实例表述为一个简单语言中的句子。去构建一个解释器,该解释器通过解释这些句子来解决该问题
Structure_结构5
Participants_参与者6
- AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作
- TerminalExpression(终结符表达式):抽象表达式的子类,用来实现方法中与终结符相关的操作
- NonterminalExpression(非终结符表达式):抽象表达式的子类,用来实现方法中与非终结符相关的操作
- Context(环境):通常包含各个解释器需要的数据或是公共功能
- Client(客户):调用解释器解释需要分析的句子或表达式
Collaborations_协作7
- AbstractExpression定义一个所有的具体表达式都需要实现的抽象接口
-> 主要包含一个interpret()方法,称做解释器方法 - TerminalExpression、NonterminalExpression实现AbstractExpression中所要求的接口
-> 方法中的每个终结符都有一个具体的TerminalExpression与之相对应
-> 方法中的每一条规则都需要一个具体的NonterminalExpression与之相对应
-> 例如公式:R=R1+R2中;R1和R2就是终结符,对应的解释R1和R2的解释器就是TerminalExpression,"+“就是非终结符,对应解释”+"的解释器就是一个NonterminalExpression - Context存放方法中各个终结符所对应的具体数据或公共功能
-> 例如公式:R=R1+R2中;给R1赋值100,给R2赋值200,这些信息应当存放到Context中
-> 一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取具体数据
-> 大多数情况下,使用Map来充当Context就足已 - 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
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎
Interpreter(解释器)相关推荐
- 熟悉Python Interpreter解释器
1. 启动python解释器 2. python解释器的两种模式 3. 错误处理 4. 设置python解释器启动代码 5. 执行python module 5.1 python文件注释 5.2 如何 ...
- 设计模式之 Interpreter(解释器) 通俗理解
23种设计模式 1 Interpreter定义: 定义语言的文法 ,并且建立一个解释器来解释该语言中的句子.通俗来讲就是定义一套规则,然后有个工具类,根据你传入的参数就知道你表达的意思. Interp ...
- Interpreter解释器模式
前言: 关于23种设计模式的所有示例代码请参考:https://github.com/Wuchenwcf/MyCode/tree/master/DP 本文所述代码请参考:https://github. ...
- 浅谈Interpreter解释器模式
一.前言 这是我们23个设计模式中最后一个设计模式了,大家或许也没想到吧,竟然是编译原理上的编译器,这样说可能不对,因为编译器分为几个部分组成呢,比如词法分析器.语法分析器.语义分析器.中间代码优化器 ...
- Interpreter(解释器模式)行为型
解释器模式 一.概述 二.结构 三.实例 四.适用场景 五.优缺点 一.概述 描述:当不懂英文的中国人和不懂中文的外国人交流时会存在沟通障碍.这时有种翻译器能将两种语言进行转换各个对方国家语言,然后进 ...
- Interpreter解释器(行为型模式)
动机(Motivation) 在软件构建中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的变成方式来实现将面临非常频繁的变化. 在这种情况下,将特定领域的问题表达为某种语法规则 ...
- Interpreter - 解释器模式
定义 给定一个语言, 定于它的文法,并定义一个解释器,这个解释器使用改表示来解释语言中的句子. 类型 行为型模式 案例 像很熟知的正則表達式就是描写叙述字符串模式的一种标准语言,它为每个模式都构造了一 ...
- [转载] C#面向对象设计模式纵横谈——16 Interpreter解释器模式
主讲:李建忠 来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD. ...
- 设计模式之解释器模式(Interpreter)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- java interpreter_解释器模式(Interpreter)Java
定义: 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 结构图: AbstractExpression解释器模式 ...
最新文章
- php7 ext skel_基于PHP7的PHP扩展开发之一(hello word)
- Amazon Aurora 升级, 兼容 PostgreSQL
- 围观云栖大会有感:从不“栖”而遇到后会有“栖”
- 006商城项目:该项目的路径访问问题
- 微信小程序 等待几秒、_微信小程序—setTimeout定时器的坑
- 线程锁定CPU linux,linux 线程与CPU绑定
- 测试方案和测试计划的区别
- springboot security
- Unity3d之Http通讯GET方法和POST方法
- 中澳科学家在量子安全通信领域合作研究取得突破性进展
- linux 内核恐慌,linux – CentOS 6.5 mdadm Raid 1 – raid数据检查期间的内核恐慌
- python执行方式及变量
- 自己手写WEB程序框架并执行
- 使用vue脚手架vue-cli搭建项目
- PRML_4章 线性模型分类笔记
- 学习JSON的神级网站www.bejson.com
- 数字图像处理-基本知识总结
- Windows Azure Active Directory (1) 前言 - 基于声明的验证和授权
- 小数的二进制与十进制转换
- C语言中delay的用法