记录下学习设计模式-解释器模式的写法。JDK使用版本为1.8版本。
意图:定义一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
结构:
其中:
适用性:
package com.example.deesign_patterns.interpreter;
//抽象表达式类
public abstract class AbstractExpression {
public abstract int interpret(Context context);
}
package com.example.deesign_patterns.interpreter;
import java.util.HashMap;
import java.util.Map;
//环境角色类
public class Context {
//定义一个map集合,用来存储变量及对应的值
private Map<Variable,Integer> map=new HashMap<Variable,Integer>();
//添加变量的功能
public void assign(Variable var,Integer value){
map.put(var,value);
}
//根据变量获取对应的值
public int getValue(Variable var){
return map.get(var);
}
}
package com.example.deesign_patterns.interpreter;
//封装变量的类
public class Variable extends AbstractExpression{
//声明存储变量名的成员变量
private String name;
public Variable(String name) {
this.name = name;
}
@Override
public int interpret(Context context) {
//直接返回变量的值
return context.getValue(this);
}
@Override
public String toString() {
return name;
}
}
package com.example.deesign_patterns.interpreter;
//加法表达式类
public class Plus extends AbstractExpression{
//加号左边的表达式
private AbstractExpression left;
//加号右边的表达式
private AbstractExpression right;
public Plus(AbstractExpression left, AbstractExpression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret(Context context) {
//将左边表达式的结果和右边表达式的结果进行相加
return left.interpret(context)+right.interpret(context);
}
@Override
public String toString() {
return "("+left.toString()+"+"+right.toString()+")";
}
}
package com.example.deesign_patterns.interpreter;
//减法表达式类
public class Minus extends AbstractExpression{
//减法左边的表达式
private AbstractExpression left;
//减法右边的表达式
private AbstractExpression right;
public Minus(AbstractExpression left, AbstractExpression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret(Context context) {
//将左边表达式的结果和右边表达式的结果进行相减
return left.interpret(context)-right.interpret(context);
}
@Override
public String toString() {
return "("+left.toString()+"-"+right.toString()+")";
}
}
package com.example.deesign_patterns.interpreter;
//测试类
public class Client {
public static void main(String[] args) {
//创建环境对象
Context context=new Context();
//创建多个变量对象
Variable a=new Variable("a");
Variable b=new Variable("b");
Variable c=new Variable("c");
Variable d=new Variable("d");
//将变量存储到环境对象中
context.assign(a,1);
context.assign(b,2);
context.assign(c,3);
context.assign(d,4);
//获取抽象语法树,如:(a-((b-c)+d))
AbstractExpression expression=new Minus(a,new Plus(new Minus(b,c),d));
//解释(计算)
int result=expression.interpret(context);
System.out.println(expression+"="+result);
}
}
好处:
缺点: