解释器模式
解释器模式属于行为型模式
解释器模式实现一个表达式接口,该接口解释一个特定的上下文,
让计算机按照我们的解释去执行。
包含抽象解释器、终结符表达式、非终结符表达式、上下文四个角色。
终结符表达式:不依赖其它解释器,就比如运算数;
非终结符表达式:依赖其它解释器才有意义,比如运算符;
对于a+b,a、b是运算数,+是运算符。
上下文
上下文其实就是环境,这里我们用map替代
抽象解释器-表达式接口
AbstractExpression
package com.example.duohoob.dp.interpreter;
import java.util.Map;
/**
* 抽象解释器-表达式接口
* @Title: AbstractExpression.java
* @Package com.example.duohoob.dp.interpreter
*
* @author yangwei
* @date 2022年7月13日
*/
public interface AbstractExpression {
/**
* 这就是解释
* @author yangwei
* @date 2022年7月13日
*
* @param context 上下文、就是环境,这里我们用map
* @return
*/
int interpreter(Map<String, Integer> context);
}
终结符解释器-解释运算数
OperandExpression
package com.example.duohoob.dp.interpreter;
import java.util.Map;
/**
* 终结符解释器-解释运算数
* @Title: OperandExpression.java
* @Package com.example.duohoob.dp.interpreter
*
* @author yangwei
* @date 2022年7月13日
*/
public class OperandExpression implements AbstractExpression {
/**
* 变量名
*/
private String key;
public OperandExpression(String key) {
this.key = key;
}
@Override
public int interpreter(Map<String, Integer> context) {
// TODO Auto-generated method stub
if (context.containsKey(key)) {
return context.get(key);
}
return 0;
}
}
非终结符解释器-解释运算符
OperatorExpression
package com.example.duohoob.dp.interpreter;
/**
* 非终结符解释器-解释运算符
* @Title: OperatorExpression.java
* @Package com.example.duohoob.dp.interpreter
*
* @author yangwei
* @date 2022年7月13日
*/
public abstract class OperatorExpression implements AbstractExpression {
protected OperandExpression left;
protected OperandExpression right;
/**
* 每个运算符号都需要有左右两个操作数
* @param left
* @param right
*/
public OperatorExpression(OperandExpression left, OperandExpression right) {
this.left = left;
this.right = right;
}
}
具体解释器-加法解释器
AdditionExpression
package com.example.duohoob.dp.interpreter;
import java.util.Map;
/**
* 具体解释器-加法解释器
* @Title: AdditionExpression.java
* @Package com.example.duohoob.dp.interpreter
*
* @author yangwei
* @date 2022年7月13日
*/
public class AdditionExpression extends OperatorExpression {
public AdditionExpression(OperandExpression left, OperandExpression right) {
super(left, right);
}
/**
* 加法
* @author yangwei
* @date 2022年7月13日
*
* @param context
* @return
*/
@Override
public int interpreter(Map<String, Integer> context) {
// TODO Auto-generated method stub
return left.interpreter(context) + right.interpreter(context);
}
}
测试a+b
package com.example.duohoob.dp.interpreter;
import java.util.HashMap;
import java.util.Map;
/**
* @Title: InterpreterTest.java
* @Package com.example.duohoob.dp.interpreter
*
* @author yangwei
* @date 2022年7月13日
*/
public class InterpreterTest {
/**
* 实现a+b
* @author yangwei
* @date 2022年7月13日
*
* @param args
*/
public static void main(String[] args) {
// 上下文环境
Map<String, Integer> context = new HashMap<String, Integer>();
context.put("a", 1);
context.put("b", 2);
// 运算数、终结符表达式
OperandExpression left = new OperandExpression("a");
OperandExpression right = new OperandExpression("b");
// 运算符、非终结符表达式
AdditionExpression addition = new AdditionExpression(left, right);
// 让计算机执行加法
int sum = addition.interpreter(context);
System.out.println("a + b = " + sum);
}
}
运行