* 解释模式:用得极其少:此处用一个加法和乘法例子说明:
* 模式特点:一个表达式接口(Expression)和多个实现类,表达式接口有个解释的方法interpret();
* 表达式接口的实现类分成2类: 非终结符表达式(NonterminalExpression),例如 加号就是非总结表达式,因为是一个过程
* 终结符表达式(TerminalExpression):就是能取到具体指的表达表达式,如 5这个数字就是终结表达式,因为它不是一个过程
* Context:上下文,用于存储终结表达式的值
* 本例模拟实现加法和乘法的过程
*/
//抽象解释器(AbstractExpression)
public interface Expression {
int interpret(Context context);
}
//终结表达式,获取具体值
public class NumberExpression implements Expression{
private String name;
public NumberExpression(String name) {
this.name = name;
}
//通过名字在上下文获取具体的值
@Override
public int interpret(Context context) {
return context.interpret(name);
}
}
//非终结符表达式(NonterminalExpression) 乘法
public class MultipyEpression implements Expression{
private Expression e1,e2; //e1,e2都是终结表达式
public MultipyEpression(Expression e1, Expression e2) {
this.e1 = e1;
this.e2 = e2;
}
@Override
public int interpret(Context context) {
//乘法运算
return this.e1.interpret(context)*this.e2.interpret(context);
}
}
//非终结符表达式(NonterminalExpression) 加法
public class AddExpression implements Expression {
private Expression e1,e2; //e1,e2都是终结表达式
public AddExpression(Expression e1, Expression e2) {
this.e1 = e1;
this.e2 = e2;
}
@Override
public int interpret(Context context) {
//加法运算
return this.e1.interpret(context)+this.e2.interpret(context);
}
}
//上下文表达式
public class Context {
private Map<String,Integer> map=new HashMap<>();
//存储终结表达式的值
public void addNum(String name,Integer num){
if(null==map.get(name)){
map.put(name,num);
}
}
//获取终结表达式的值
public int interpret(String name){
return map.get(name);
}
}
public class Test {
public static void main(String[] args) {
Context context = new Context();//上下文对象
Expression e1 = new NumberExpression("e1"); //终结表达式
Expression e2 = new NumberExpression("e2");//终结表达式
Expression e3 = new NumberExpression("e3");//终结表达式
context.addNum("e1",2);//给终结表达式 赋值
context.addNum("e2",6);//给终结表达式 赋值
context.addNum("e3",3);//给终结表达式 赋值
//计算(2+6)*3
MultipyEpression multipyEpression = new MultipyEpression(new AddExpression(e1, e2), e3);
System.out.println(multipyEpression.interpret(context));//24
}
}