Behavioral模式之Interpreter模式
2015-06-25 20:01
197 查看
1.意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。2.别名
无3.动机
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种实例表述为一种简单语句中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。4.适用性
以下情况使用Interpreter模式:当有一种语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可使用解释器模型。而当存在以下情况时该模式效果最好。
- 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。他们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可能节省时间。
- 效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将他们转换成另一种形态。例如,正则表达式通常被转换成状态机。但及时在这种情况下,转化器仍可用解释器模式实现,该模式仍是有用的。
5.结构
释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄。6.代码示例
实现代码:Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下:
[code]public interface Expression { public int interpret(Context context); }
实现类
[code]public class Plus implements Expression { @Override public int interpret(Context context) { return context.getNum1()+context.getNum2(); } } public class Minus implements Expression { @Override public int interpret(Context context) { return context.getNum1()-context.getNum2(); } }
Context类
[code]public class Context { private int num1; private int num2; public Context(int num1, int num2) { this.num1 = num1; this.num2 = num2; } public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } }
测试类:
[code]public class Test { public static void main(String[] args) { // 计算9+2-8的值 int result = new Minus().interpret((new Context(new Plus() .interpret(new Context(9, 2)), 8))); System.out.println(result); } }
最后输出正确的结果:3。
基本就这样,解释器模式用来做各种各样的解释器,如正则表达式等的解释器等等!
7.相关模式
Composite模式:抽象语法树是一个复合模式的实例。Flyweight模式:说明了如何在抽象语法树中共享终结符。
Iterator模式:解释器可用一个迭代器遍历该结构。
Visitor模式:可用来在一个类中维护抽象语法树中的各节点的行为。
引用:
http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
/article/1354307.html
相关文章推荐
- C++ Primer 学习笔记_7_标准库类型(续1) -- vector类型
- Makefile 中:= ?= += =的区别
- 五子棋C语言实现
- 随机生成一个 10 个元素的数组,找到 x 的倍数,并将其值修改成 0.(注意:修改数值使用回掉函数处理)
- Android显示和隐藏软键盘
- Android开发容易忽略的小错误记录整理
- CRC16计算
- 低情商的九种表现
- MVC的Filters(拦截过滤)的Error页面,支持Ajax报错
- 【Android】一个浏览图片的Android库的实现,可以移动、缩放图片以及滑动切换
- iOS-学习笔记-UI-第十七天
- 北大百炼1003 Hangover 题解
- iOS-学习笔记-UI-第十六天
- JS获取IP、MAC和主机名的几种方法
- Codeforces Round #309 (Div. 2) B. Ohana Cleans Up
- 状态栏高度
- 随笔
- response.setHeader()的用法 收藏
- STM8S学习GPIO操作
- 从UTF8格式向GB2312格式转换[C源码](转)