一句话
看起来是用来解释一种语言的文法。(类似不同的解释器子类解释不同的字符)
和编译器类似的解释器, 实际状况可能使用的比较少。
概括
解析
INTERPRETER—俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。
解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。
实例
包含的文件有:
一个解释器的抽象类 (Expression.java)
一个上下文的类, 这个上下文类中有解释器类的列表(Context.java)
两个解释器的子类(Type1Expression.java ; Type2Expression.java)
通过不同的解释器,把相应的语言做一些转换。
测试类 TestMain.java
/**
* @author oscar999
* @date 2015-1-6
* @version V1.0
*/
package designptn.interpreter;
public abstract class Expression {
abstract void interpret(Context ctx);
}
/**
* @author oscar999
* @date 2015-1-6
* @version V1.0
*/
package designptn.interpreter;
import java.util.ArrayList;
import java.util.List;
public class Context {
private String context;
private List<Expression> list = new ArrayList<Expression>();
public void setContent(String content) {
this.context = content;
}
public String getContent() {
return this.context;
}
public void add(Expression eps) {
list.add(eps);
}
public List<Expression> getList() {
return list;
}
}
/**
* @author oscar999
* @date 2015-1-6
* @version V1.0
*/
package designptn.interpreter;
public class Type1Expression extends Expression {
void interpret(Context ctx) {
// TODO Auto-generated method stub
System.out.println("Interpret Type1 content!");
}
}
/**
* @author oscar999
* @date 2015-1-6
* @version V1.0
*/
package designptn.interpreter;
public class Type2Expression extends Expression {
void interpret(Context ctx) {
// TODO Auto-generated method stub
System.out.println("Interpret Type2 content!");
}
}
/**
* @author oscar999
* @date 2015-1-6
* @version V1.0
*/
package designptn.interpreter;
/**
* @author Administrator
*
*/
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Context ctx = new Context();
ctx.add(new Type1Expression());
ctx.add(new Type2Expression());
for(Expression eps : ctx.getList())
{
eps.interpret(ctx);
}
}
}