什么是解析器模式
給定一種語(yǔ)言,定義它的文法表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中句子(通過(guò)解析器解析自定義的表達(dá)式返回解析后的信息)
示例圖

圖片.png
示例場(chǎng)景
使用自定義的表達(dá)式進(jìn)行相加 相減操作。
比如:e1=2 e2=8 e3=6, e1+e2=10, e2-e3=2, e1+e2-e3=4
示例代碼
1.創(chuàng)建Expression解析器接口
public interface Expression {
int interpreter(Context context);
}
2.創(chuàng)建Context上下文類(lèi)
public class Context {
private Map<Expression, Integer> map = new HashMap<>();
//添加解析器對(duì)象
public void add(Expression s, Integer value){
map.put(s, value);
}
//獲取解析后的值
public int getValue(Expression s){
return map.get(s);
}
}
3.創(chuàng)建TerminalExpression終結(jié)表達(dá)式
public class TerminalExpression implements Expression{
@Override
public int interpreter(Context context) {
return context.getValue(this);
}
}
4.創(chuàng)建NonTerminalExpression非終結(jié)表達(dá)式
public abstract class NonTerminalExpression implements Expression{
Expression e1,e2;
public NonTerminalExpression(Expression e1, Expression e2){
this.e1 = e1;
this.e2 = e2;
}
}
5.創(chuàng)建非終結(jié)表達(dá)式實(shí)現(xiàn)類(lèi)PlusOperation相加操作和MinusOperation相減操作
public class PlusOperation extends NonTerminalExpression {
public PlusOperation(Expression e1, Expression e2) {
super(e1, e2);
}
//將兩個(gè)表達(dá)式相加
@Override
public int interpreter(Context context) {
return this.e1.interpreter(context) + this.e2.interpreter(context);
}
}
public class MinusOperation extends NonTerminalExpression {
public MinusOperation(Expression e1, Expression e2) {
super(e1, e2);
}
//將兩個(gè)表達(dá)式相減
@Override
public int interpreter(Context context) {
return this.e1.interpreter(context) - this.e2.interpreter(context);
}
}
6.創(chuàng)建Client啟動(dòng)類(lèi)
public class Client {
public static void main(String[] args) {
Context context = new Context();
TerminalExpression e1 = new TerminalExpression();
TerminalExpression e2 = new TerminalExpression();
TerminalExpression e3 = new TerminalExpression();
context.add(e1, 2);
context.add(e2, 8);
context.add(e3, 6);
System.out.println("------------------------------表達(dá)式相減操作");
MinusOperation minusOperation = new MinusOperation(e1, e2);
System.out.println(minusOperation.interpreter(context));
System.out.println("------------------------------表達(dá)式相加操作");
PlusOperation plusOperation = new PlusOperation(e1,e3);
System.out.println(plusOperation.interpreter(context));
System.out.println("------------------------------表達(dá)式先加再減操作");
Expression expression = new MinusOperation(new PlusOperation(e1, e2), e3);
System.out.println(expression.interpreter(context));
}
}
7.運(yùn)行結(jié)果

圖片.png