设计模式-行为型之解释器模式
来源:互联网 发布:java文件中文乱码 编辑:程序博客网 时间:2024/05/16 10:05
模式动机
如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个“语言”中的“句子”,可以构建一个解释器,该解释器通过解释这些“句子”来解决这些问题。比如我们需要经常进行字符串的匹配,我们可以把这种匹配算法定义为一种“语言”,说到这里,你应该明白了,我指的这种“语言”正是我们的正则表达式,而一个具体的正则表达式如“/^\d{4}$/”则是我们的“句子”,我们通过解析这个“句子”来解决我们的字符串匹配问题。负责解析这个“句子”的叫做解释器。
模式定义
解释器模式:定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码。
模式结构
抽象表达式:AbstractExpression,定义一个抽象的解释操作
终结符表达式:TerminalExpression,对终结符进行解释操作
非终结符表达式:NonterminalExpression,对非终结符进行解释操作
环境类 : Context,包含解释器之外的一些全局信息
代码示例
//抽象表达式public abstract class AbstractExpression { public abstract int interpreter(Context context);}
//非终结符表达式-减法运算符public class MinusExpression extends AbstractExpression{ private AbstractExpression left; private AbstractExpression right; public MinusExpression(AbstractExpression left,AbstractExpression right){ this.left = left; this.right = right; } @Override public int interpreter(Context context) { return left.interpreter(context) - right.interpreter(context); }}
//非终结符表达式-加法运算符public class PlusExpression extends AbstractExpression{ private AbstractExpression left; private AbstractExpression right; public PlusExpression(AbstractExpression left,AbstractExpression right){ this.left = left; this.right = right; } @Override public int interpreter(Context context) { return left.interpreter(context) + right.interpreter(context); }}
//终结符表达式-变量值public class ValueExpression extends AbstractExpression{ private int value; public ValueExpression(int value){ this.value = value; } @Override public int interpreter(Context context) { return value; }}
import java.util.HashMap;import java.util.Map;//环境类public class Context { private Map<String, Integer> map = new HashMap<String, Integer>(); public void addValue(String key,int value) { map.put(key, Integer.valueOf(value)); } public int getValue(String key) { return map.get(key).intValue(); }}
//客户端测试import java.util.HashMap;import java.util.Map;public class Client { public static void main(String[] args) { Context context = new Context(); Map<String,Integer> map = new HashMap<String,Integer>(); map.put("a", 1); map.put("b", 2); map.put("c", 3); //a+b PlusExpression expression1 = new PlusExpression(new ValueExpression(map.get("a")), new ValueExpression(map.get("b"))); int result1 = expression1.interpreter(context); System.out.println(result1);//3 //a+b-c MinusExpression expression2 = new MinusExpression(expression1, new ValueExpression(map.get("c"))); int result2 = expression2.interpreter(context); System.out.println(result2);//0 }}
总结
解释器模式主要包含如下四个角色:在抽象表达式中声明了抽象的解释操作,它是所有的终结符表达式和非终结符表达式的公共父类;终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解释操作;非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作;环境类又称为上下文类,它用于存储解释器之外的一些全局信息。
解释器模式的主要优点包括易于改变和扩展文法,易于实现文法并增加了新的解释表达式的方式;其主要缺点是对于复杂文法难以维护,执行效率较低且应用场景很有限。
0 0
- 设计模式笔记--行为型模式-之三 解释器
- 【小话设计模式】行为型之解释器模式
- 设计模式(行为型)之解释器模式(Interpreter Pattern)
- 设计模式-行为型之解释器模式
- Java设计模式(行为型)之-解释器模式
- 设计模式--行为型--解释器模式
- 行为型设计模式-解释器模式
- 行为型设计模式-解释器模式
- 设计模式-行为-解释器
- 设计模式 - 行为型模式 - 解释器模式
- GoF23种设计模式之行为型模式之解释器模式
- 二十三种设计模式之行为型模式之解释器模式
- 【设计模式】行为模式之解释器Interpreter
- 设计模式16——行为型模式之解释器模式
- 行为设计模式---解释器模式(Interpreter)
- 行为型模式之解释器INTERORETER
- 设计模式笔记(16)---解释器模式(行为型)
- 设计模式(15)-行为型-解释器模式(Interpreter)
- 非递归学习树结构(二)--前中后遍历
- 从键盘输入6个字符串(仅仅包含英文字母和数字),对这6个字符串从小到大排列并输出结果。
- 抽象类和接口的区别
- java面试笔试题大汇总
- like查询与索引
- 设计模式-行为型之解释器模式
- golang学习笔记之---waitgoup
- HDU 5437 Alisha’s Party
- win8系统安装Oracle 11g报错:[INS-13001]环境不满足最低要求--解决办法
- 只看楼主 回复 分享 收藏 [面试经历] 360搜索面试总结
- 基础题 4 ——《实用算法基础教程》
- 关于C语言中数据类型的转化方式
- What are the open source code search engines you know about
- oracle树形查询