解释器模式,看起来平时用的不多,升华一点,我们在编程时比较高的境界是先构造语义,用来DSL来描述业务,然后用某个计算模型来实现语义。到这个层次,可以想一下,使用场景并不少,而且是比较高明、高层次、高难度的使用。
实现语义有两种方法,一种是编译器,一种是解释器,这就是SICP的第四第五章,武林秘籍的最高层次。
我们一般人到不了那个层次,但是学习简单一点的模式是没有问题的。例如说实现加减法的解释器。
例子
public interface Expression {
long interpret();
}
public class NumExpression implement Expression {
private long num;
public NumExpression(String s) {
this.num = Long.parseLong(s);
}
long interpret() {
return this.num;
}
}
public class AddExpression implement Expression {
private Expression left;
private Expression right;
public NumExpression(Expression left, Expresson right) {
this.left = left;
this.right = rigth;
}
long interpret() {
return this.left.interpret() + this.right.interpret();
}
}
public class SubExpression implement Expression {
private Expression left;
private Expression right;
public NumExpression(Expression left, Expresson right) {
this.left = left;
this.right = rigth;
}
long interpret() {
return this.left.interpret() - this.right.interpret();
}
}
public class Application {
public static void main(string[] argc) {
String exp = "3 + 2 + 1";
Stack<Expression> expressions = new Stack<Expression>();
Stack<String> operators = new Stack<String>();
// 解析式子 [Expression("3"), Expression("2"), Expression("1")] ["+", "-"]
while (!operator.empty()) {
String oper = operator.pop();
Expression left = expresions.pop();
Expression right = expresions.pop();
if (oper == "+") {
expressions.push(new AddExpresion(left, right));
} else {
expressions.push(new SubExpression(left. right));
}
}
if (expressions.empty()) {
// 抛出异常
}
Long result = expressions.pop().interpret();
这就是一个比较简单的解释器
小结
解释器模式虽然比较少用,但是在一些领域语言驱动设计的方式中,是一种比较实用的设计实现方式。
网友评论