Design Pattern(8)-Interpreter Pattern
来源:互联网 发布:金融程序员薪资水平 编辑:程序博客网 时间:2024/06/07 21:50
适用场景
提供一种方式,用来定义语言的文法表达,并解释执行。
类图
实例代码
这个地方,定义了一个加法表达式,为了简单起见,只有加法,没有其他运算,且假设每个变量名长度只有一个字母。
AbstractExpression:
public abstract class AbstractExpression { abstract int interpret(Context context);}
TerminalExpression:
public class TerminalExpression extends AbstractExpression{ private String variable_name; public TerminalExpression(String variable_name) { this.variable_name = variable_name; } @Override int interpret(Context context) { return context.get(variable_name); }}
AddExpression:
public class AddExpression extends AbstractExpression { AbstractExpression expression1; AbstractExpression expression2; public AddExpression(AbstractExpression expression1, AbstractExpression expression2) { this.expression1 = expression1; this.expression2 = expression2; } @Override int interpret(Context context) { return expression1.interpret(context)+expression2.interpret(context); }}
Context:
import java.util.Map;import java.util.Stack;/** * Created by windkl on 2017/3/26. */public class Context { Map<String,Integer> variable_table; AbstractExpression expression; public Context(String expression, Map<String,Integer> variable_table){ this.variable_table=variable_table; Stack<AbstractExpression> stack=new Stack<>(); for(int i=0;i<expression.length();i++){ switch (expression.charAt(i)){ case '+': AbstractExpression left=stack.pop(); i++; AbstractExpression right=new TerminalExpression(expression.charAt(i)+""); AddExpression addExpression=new AddExpression(left,right); stack.push(addExpression); break; default: AbstractExpression variable=new TerminalExpression(expression.charAt(i)+""); stack.push(variable); } } if(stack.size()==1) this.expression=stack.pop(); } public int calculate(){ return expression.interpret(this); } public void add(String variable_name, int value){ if(!variable_table.containsKey(variable_name)) variable_table.put(variable_name,value); } public int get(String variable_name){ return variable_table.get(variable_name); }}
Client:
import java.util.HashMap;import java.util.Map;/** * Created by windkl on 2017/3/26. */public class Client { public static void main(String[] args){ Map<String,Integer> variables=new HashMap<>(); variables.put("a",3); variables.put("b",5); variables.put("c",8); Context context=new Context("a+b+c",variables); System.out.print(context.calculate()); }}
后续思考:认为parse表达式构建Expression的部分,不应该放在Context中,Context就应该是一个变量表,提供put和add方法。可以额外创建一个Parser类执行parse的任务,Client调用这个Parser得到对应计算表达式的Expression,然后Client调用expression.interpreter(context).
又想了一下,感觉可以用Builder Pattern来解决Expression的问题。
参考文献:http://wangwengcn.iteye.com/blog/1733971
0 0
- Design Pattern(8)-Interpreter Pattern
- design pattern notes [8] - interpreter, and command
- [Special] Design Pattern - Behavioral Patterns - Interpreter Pattern
- Design Pattern - Interpreter(C#)
- design pattern——interpreter
- Interpreter Pattern(GoF-Behavioral Design Patterns)
- Design Pattern Interpreter 解析者模式
- Interpreter pattern
- Design Pattern 8-singleton
- Design pattern----Facade Pattern
- Design pattern----Strategy Pattern
- Design Pattern --------Observer pattern
- Design Pattern --- Factory Pattern
- Design Pattern - Factory Pattern
- Design Pattern - Factory Pattern
- [Design Pattern]Observer Pattern
- Design Pattern
- Design pattern
- 跳舞毯
- Leetcode Week5
- Log4J的简单使用
- XAMPP Mysql 忘记root密码解决方案
- 全局变量惹的祸
- Design Pattern(8)-Interpreter Pattern
- 2017广东工业大学程序设计竞赛决赛 A 两只老虎
- linux学习记录
- Codeforces-785E-Anton and Permutation(分块区间查询,动态查询[l,r]内小于某个值的元素个数)
- Android应用层View绘制流程
- dic 的遍历方法
- Android 解决视图小而触发事件区域大的办法
- css3+html+Jquery实现鼠标滑过图片切换效果
- chown命令