Interpreter Pattern:其意图是给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子.
Expression.java
package com.flyingh.dp.interpreter;
public abstract class Expression {
public abstract int interpret(Context ctx);
}
Constant.java
package com.flyingh.dp.interpreter;
public class Constant extends Expression {
private int value;
public Constant(int value) {
super();
this.value = value;
}
@Override
public int interpret(Context ctx) {
// TODO Auto-generated method stub
return value;
}
}
Variable.java
package com.flyingh.dp.interpreter;
public class Variable extends Expression {
@Override
public int interpret(Context ctx) {
// TODO Auto-generated method stub
return ctx.lookup(this);
}
}
Add.java
package com.flyingh.dp.interpreter;
public class Add extends Expression {
private Expression left;
private Expression right;
public Add(Expression left, Expression right) {
super();
this.left = left;
this.right = right;
}
@Override
public int interpret(Context ctx) {
// TODO Auto-generated method stub
return left.interpret(ctx) + right.interpret(ctx);
}
}
Minus.java
package com.flyingh.dp.interpreter;
public class Minus extends Expression {
private Expression left;
private Expression right;
public Minus(Expression left, Expression right) {
super();
this.left = left;
this.right = right;
}
@Override
public int interpret(Context ctx) {
// TODO Auto-generated method stub
return left.interpret(ctx) - right.interpret(ctx);
}
}
Context.java
package com.flyingh.dp.interpreter;
import java.util.HashMap;
import java.util.Map;
public class Context {
private Map<Variable, Integer> map = new HashMap<Variable, Integer>();
public int lookup(Variable var) {
// TODO Auto-generated method stub
int value = 0;
try {
value = map.get(var);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(var + "还没有赋值!");
}
return value;
}
public void assign(Variable var, int value) {
map.put(var, value);
}
}
Client.java
package com.flyingh.dp.interpreter;
public class Client {
public static void main(String[] args) {
Variable var1 = new Variable();
Variable var2 = new Variable();
Expression con = new Constant(1);
Context ctx = new Context();
ctx.assign(var1, 5);
ctx.assign(var2, 8);
Expression add = new Add(new Constant(3), var1);
System.out.println(add.interpret(ctx));
Expression add2 = new Add(con, var1);
System.out.println(add2.interpret(ctx));
System.out.println("*************");
ctx.assign(var1, 10);
ctx.assign(var2, 5);
Expression minus = new Minus(var1, var2);
System.out.println(minus.interpret(ctx));
System.out.println(new Minus(var2, new Constant(4)).interpret(ctx));
}
}
程序运行结果如下:
8
6
*************
5
1