一、什么是解释器模式?
解释器模式定义语言的语法,并建立解释器来解释语法中的句子。如正则表达式等的解释器。
解释器模式涉及到以下几个角色:
1. 抽象表达式角色:定义了具体的表达式需要实现的抽象解释方法或接口
2. 具体表达式角色:指定了具体的表达式的解释
3. 环境(Context)角色: 包含了解释器之外的一些全局信息
4. 客户端角色:创建具体表达式并让解释器进行解释
二、解释器模式框图
以变量的加减法为例:
三、解释器模式的具体实现代码
3.1 Expression——抽象解释器
package designpatterns.interpreter;
/**
* Created by Olive on 2017/12/27.
* 抽象解释器
*/
public abstract class Expression {
public abstract int interpret(Context context);
}
3.2 Variable、Add、Subtraction——具体的解释器,分别代表变量,加法和减法
package designpatterns.interpreter;
/**
* Created by Olive on 2017/12/27.
* 变量类,解释器方法返回此变量对应的值
*/
public class Variable extends Expression{
@Override
public int interpret(Context context) {
return context.findValue(this);
}
}
/**
* Created by Olive on 2017/12/27.
* 加法解释器
*/
public class Add extends Expression{
private Expression left, right;
public Add(Expression left, Expression right){
this.left = left;
this.right = right;
}
@Override
public int interpret(Context context) {
return left.interpret(context) + right.interpret(context);
}
}
/**
* Created by Olive on 2017/12/27.
* 减法解释器
*/
public class Subtraction extends Expression{
private Expression left, right;
public Subtraction(Expression left, Expression right){
this.left = left;
this.right = right;
}
@Override
public int interpret(Context context) {
return left.interpret(context) - right.interpret(context);
}
}
3.3 Context——环境角色,用HashMap储存变量以及对应的值
package designpatterns.interpreter;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Olive on 2017/12/27.
* 环境角色,用HashMap储存变量以及对应的值
*/
public class Context {
private Map<Variable, Integer> valueMap = new HashMap();
public void addValue(Variable x, int y){
valueMap.put(x, new Integer(y));
}
public int findValue(Variable x){
int value = valueMap.get(x).intValue();
return value;
}
}
3.4 Client——客户端
package designpatterns.interpreter;
/**
* Created by Olive on 2017/12/27.
*/
public class Client {
public static void main(String[] args){
Context context = new Context();
// 设置变量
Variable a = new Variable();
Variable b = new Variable();
Variable c = new Variable();
// 为变量赋值
context.addValue(a, 3);
context.addValue(b, 2);
context.addValue(c, 1);
// 进行运算
Expression expression = new Add(new Subtraction(a, c), b);
System.out.println(expression.interpret(context));
}
}
3.5 结果
4
Process finished with exit code 0