您的位置:首页 > 其它

设计模式—— 解释器模式

2016-06-30 11:28 288 查看
解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的方案,实际很少有用到。

角色

(1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。

(2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

(3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。

(4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

代码实现

<span style="font-size:14px;">package com.sun.expression.cg;

import java.util.HashMap;
/**
* 环境角色
* @author work
*
*/
public class Context {

private HashMap<Variable,Boolean> map = new HashMap<Variable,Boolean>();

public boolean lookup(Variable v) throws Exception {
Boolean val = map.get(v);
if(val==null) {
throw new Exception();
}
return val.booleanValue();
}

public void assign(Variable v,Boolean b) {
map.put(v, b);
}
}
</span>

<span style="font-size:14px;">package com.sun.expression.cg;
/**
* 抽象表达式
* @author work
*
*/
public abstract class Expression {

public abstract boolean interpret(Context ctx);

}
</span>

<span style="font-size:14px;">package com.sun.expression.cg;
/**
* 常量
* @author work
*
*/
public class Constant extends Expression{

protected boolean value;

public Constant(boolean value) {
// TODO Auto-generated constructor stub
this.value = value;
}

@Override
public boolean interpret(Context ctx) {
// TODO Auto-generated method stub
return value;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return new Boolean(value).toString();
}
}
</span>

<span style="font-size:14px;">package com.sun.expression.cg;
/**
* 变量
* @author work
*
*/
public class Variable extends Expression{

private String name;

public Variable(String name) {
// TODO Auto-generated constructor stub
this.name =  name;
}

@Override
public boolean interpret(Context ctx) {
// TODO Auto-generated method stub
try {
return ctx.lookup(this);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return name;
}

}
</span>

<span style="font-size:14px;">package com.sun.expression.cg;
/**
* and表达式
* @author work
*
*/
public class And extends Expression{

private Expression right,left;

public And(Expression right,Expression left) {
this.left = left;
this.right = right;
}

@Override
public boolean interpret(Context ctx) {
// TODO Auto-generated method stub
return left.interpret(ctx) && right.interpret(ctx);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "("+left.toString()+" And "+right.toString()+")";
}
}
</span>

<span style="font-size:14px;">package com.sun.expression.cg;
/**
* not表达式
* @author work
*
*/
public class Not extends Expression{

private Expression exp;

public Not(Expression exp) {
this.exp = exp;
}

@Override
public boolean interpret(Context ctx) {
// TODO Auto-generated method stub
return !exp.interpret(ctx);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "( Not "+exp.toString()+")";
}
}
</span>

<span style="font-size:14px;">package com.sun.expression.cg;
/**
* or表达式
* @author work
*
*/
public class Or extends Expression{

private Expression right,left;

public Or(Expression right,Expression left) {
this.left = left;
this.right = right;
}

@Override
public boolean interpret(Context ctx) {
// TODO Auto-generated method stub
return left.interpret(ctx) || left.interpret(ctx);
}

@Override
public String toString() {
// TODO Auto-generated method stub
return "("+left.toString()+" OR "+right.toString()+")";
}

}
</span>


客户端
package com.sun.expression.cg;

public class Client {

private static Context c;

private static Expression e;

public static void main(String[] args) {
c = new Context();
Variable v = new Variable("v");
Variable y = new Variable("y");
Constant constant = new Constant(true);
c.assign(v,false);
c.assign(y,true);
e = new Or(new And(constant, v), new And(y,new Not(v)));
System.out.println("v:"+v.interpret(c));
System.out.println(<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">"y:"+y.interpret(c)); System.out.println(e.toString()+"结果:"+e.interpret(c));}}


打印结果:

v:false

y:true

((( Not v) And y) OR (v And true))结果:true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: