设计模式-解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
-
TerminalExpression: 终结符表达式
实现文法中与终结符有关的解释操作。
文法中的每一个终结符都有一个具体终结表达式与之相对应,比如公式R=R1+R2,R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符(R1,R2) -
NonterminalExpression: 非终结符表达式
实现文法中与非终结符有关的解释操作。
文法中的每条规则都对应于一个非终结符表达式。非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,"+“就是非终结符,解析”+"的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式
每个非终结符表达式都会对其他表达式产生依赖
我们拿一个二十四小时制时间显示解析器来举例
先定义抽象接口
public interface Expression {
String interpreter(String time);
}
然后实现两个终结符表达式
public class HourExpression implements Expression {
@Override
public String interpreter(String hour) {
String des = "";
int real = Integer.parseInt(hour);
if (real <= 12) {
if (real < 6) {
des += "凌晨";
} else {
des += "上午";
}
} else {
real -= 12;
if (real < 6) {
des += "下午";
} else {
des += "晚上";
}
}
des = des + real +"点";
return des;
}
}
public class MinuteExpression implements Expression {
@Override
public String interpreter(String minute) {
return minute + "分";
}
}
然后定义一个非终结符表达式
public class HourNotationExpression implements Expression {
private Expression hourExpression;
private Expression minuteExpression;
public HourNotationExpression(Expression hourExpression, Expression minuteExpression) {
this.hourExpression = hourExpression;
this.minuteExpression = minuteExpression;
}
@Override
public String interpreter(String time) {
String[] data = time.split(":");
return hourExpression.interpreter(data[0]) + minuteExpression.interpreter(data[1]);
}
}
调用示例
public class Demo {
public static void main(String[] args) {
HourNotationExpression expression = new HourNotationExpression(new HourExpression(), new MinuteExpression());
System.out.println(expression.interpreter("05:53"));
System.out.println(expression.interpreter("11:11"));
System.out.println(expression.interpreter("15:32"));
System.out.println(expression.interpreter("23:09"));
}
}
结果