设计模式—— 解释器模式
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>
客户端
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
解释器模式(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
相关文章推荐
- ExtraCHM 1.5破解版和破解详解
- Linux下python升级步骤
- 1、Codevs 必做:2833、1002、1003、2627、2599
- 五 Android Capabilities讲解
- HBase shell保存历史命令
- 黏包问题
- html进制转换
- 导出网站20160630
- 人生虽然很艰难,但所有的付出都有回报
- linux /etc/rc.d/目录的详解
- H5与android原生的JS交互
- python3.5入门1--运行报错:IndentationError: expected an indented block
- (7)LR如何利用siteScope监控MySQL性能
- Hadoop Journal Node 作用
- JAVA日期相减
- linux 下ssh下载文件命令
- Ansoft HFSS____百度百科
- 转载龙哥:设计模式系列之-总纲
- 博客更新
- 未名