解釋器模式
概述
給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
適用性
當有一個語言需要解釋執行,並且你可將該語言中的句子表示爲一個抽象語法樹時,可使
用解釋器模式。而當存在以下情況時該模式效果最好:
1.該文法簡單對於複雜的文法,文法的類層次變得龐大而無法管理。
2.效率不是一個關鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現的,而是首先將它們轉換成另一種形式。
參與者
1.AbstractExpression(抽象表達式)
聲明一個抽象的解釋操作,這個接口爲抽象語法樹中所有的節點所共享。
2.TerminalExpression(終結符表達式)
實現與文法中的終結符相關聯的解釋操作。
一個句子中的每個終結符需要該類的一個實例。
3.NonterminalExpression(非終結符表達式)
爲文法中的非終結符實現解釋(Interpret)操作。
4.Context(上下文)
包含解釋器之外的一些全局信息。
5.Client(客戶)
構建(或被給定)表示該文法定義的語言中一個特定的句子的抽象語法樹。
該抽象語法樹由NonterminalExpression和TerminalExpression的實例裝配而成。
調用解釋操作。
類圖
例子
AbstractExpression
public abstract class Expression {
abstract void interpret(Context ctx);
}
Expression
public class AdvanceExpression extends Expression {
void interpret(Context ctx) {
System.out.println("這是高級解析器!");
}
}
public class SimpleExpression extends Expression {
void interpret(Context ctx) {
System.out.println("這是普通解析器!");
}
}
Context
public class Context {
private String content;
private List list = new ArrayList();
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return this.content;
}
public void add(Expression eps) {
list.add(eps);
}
public List getList() {
return list;
}
}
Test
public class Test {
public static void main(String[] args) {
Context ctx = new Context();
ctx.add(new SimpleExpression());
ctx.add(new AdvanceExpression());
ctx.add(new SimpleExpression());
for (Expression eps : ctx.getList()) {
eps.interpret(ctx);
}
}
}
result
這是普通解析器!
這是高級解析器!
這是普通解析器!
Copyright © 2008 Angus Young
瘋狂Java聯盟:http://www.crazyit.org