设计模式 -- 解释器模式(Interpreter Pattern)
2015年12月15日00:19:02
今天只看了理论和demo,明天再写文章,跑步好累
2015年12月15日21:36:00
解释器模式用来解释预先定义的文法。
《大话设计模式》里面这么定义:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个势力表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。
解释器模式包含以下几个类:
- AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
- TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
- NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。
- Context: 环境类。包含解释器之外的一些全局信息。
- Client: 客户类。
优点:
容易改变和扩展文法,因为该模式使用类来标示文法规则,你可使用继承来改变和扩展该文法。也比较容易实现文法,因为定义抽象语法树种各个节点的类实现答题想死,这些类都抑郁编写。
缺点:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护,建议文法复杂的情况下使用其他技术如预防分析程序和编译器生成器来处理。
下面是个demo:
首先创建环境类Context:
package InterpreterPattern;/** 上下文环境类,用来保存文法,包含解释器之外的一些全局信息*/ public class Context {private String input;private int output;public Context(String input) {this.input = input;}public String getInput() {return input;}public void setInput(String input) {this.input = input;}public int getOutput() {return output;}public void setOutput(int output) {this.output = output;} }
然后创建抽象的Expression 类:
/*** * @ClassName: Expression* @Description: TODO(解释器的抽象类,抽象解释器的解释操作) */ public abstract class Expression {public abstract void interpret(Context context); }
然后就是实现抽象类:
自减操作:
package InterpreterPattern; /*** * @ClassName: MinusExpression* @Description: TODO(自减操作) */ public class MinusExpression extends Expression{@Overridepublic void interpret(Context context) {System.out.println("自动递减");String input = context.getInput();int inInput = Integer.parseInt(input);--inInput;context.setInput(String.valueOf(inInput));context.setOutput(inInput);}}
自加操作:
package InterpreterPattern; /*** * @ClassName: PlusExpression* @Description: TODO(自加操作) */ public class PlusExpression extends Expression {@Overridepublic void interpret(Context context) {System.out.println("自动递增");String input = context.getInput();int inInput = Integer.parseInt(input);++inInput;context.setInput(String.valueOf(inInput));context.setOutput(inInput);}}
测试类:
package InterpreterPattern;import java.util.ArrayList; import java.util.List;/*** @ClassName: Test* @Description: TODO(测试类) */ public class Test {public static void main(String[] args) {String number = "99";Context context = new Context(number); List<Expression> list = new ArrayList<Expression>();list.add(new PlusExpression());list.add(new MinusExpression());for(Expression ex : list) {ex.interpret(context);System.out.println(context.getOutput());}}}
运算结果为:
自动递增 100 自动递减 99
设计模式 -- 解释器模式(Interpreter Pattern)相关推荐
- 35解释器模式(Interpreter Pattern)
动机(Motivate): 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化. 在这种情况下,将特定领域的问题 ...
- 深入浅出设计模式——解释器模式(Interpreter Pattern)
模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题. 解释器模式描述了如何构成一 ...
- 设计模式 | 解释器模式及典型应用
微信原文:设计模式 | 解释器模式及典型应用 博客原文:设计模式 | 解释器模式及典型应用 本文主要介绍解释器模式,在日常开发中,解释器模式的使用频率比较低 解释器模式 解释器模式(Interpret ...
- 【白话设计模式二十二】解释器模式(Interpreter)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- Python设计模式-解释器模式
Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...
- java interpreter_解释器模式(Interpreter)Java
定义: 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 结构图: AbstractExpression解释器模式 ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- 设计模式-代理模式(Proxy Pattern)
设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...
- 设计模式 : 解释器模式
解释器模式(interpreter) : 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够 ...
- C++设计模式——解释器模式(interpreter pattern)
一.原理讲解 1.1意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 1.2应用场景 文法简单.对于复杂的文法,文法的类层次变得庞大而无法管理:此 ...
最新文章
- HTML语言:经典笔记(ZT)
- python如何播放视频_如何用python做一个视频搜索+播放器
- python之SQLAlchemy ORM
- redis集群添加节点报错Either the node already knows other nodes (check with CLUSTER NODES) or contains some k
- 七、区块链如何运用merkle tree验证交易真实性
- 通过代码解决全角问题类调用法
- (105)FPGA面试题-查找程序中的代码错误
- 在weblogic12c中启动工程报错缺失BeanFactoryAware
- Jdbc普通查询、流式查询、游标查询
- MSRA,我的实习初体验(上)
- 66. 编写高效的 JavaScript
- SSIS包的组建之连接管理器
- 7x android 8,内测开启 华为荣耀畅玩7X升级Android 8.0
- 在VS2010配置并运行PBC库程序
- 【科普】波特率和比特速率的理解
- 使用第三方类库对html进行解析
- js常用的正则匹配(一般不用修改)
- 用Python做单变量数据集的异常点分析
- 《Unity》 向量四元数以及常用数学公式
- 安全行业从业人员自研开源扫描器合集
热门文章
- MyEclipse8.5中的可视化界面JTable和JComboBox应用,及常用方法
- Mysql时间戳转日期-日期转时间戳
- XML内容要有根标签:Extra content at the end of the document
- Yaf引入oss sdk
- PHP PDO连接mysql,sqlsrv;得到任意2个日期之间的所有日期;递归创建文件
- Matlab简单教程:条件分支
- C++读取WINDOWS注册表
- error LNK2001: 无法解析的外部符号_wWinMainCRTStartup
- 编译OpenJDK8:NMAKE : fatal error U1077
- 由耶稣遗物看西方历史的造假