二十三種設計模式之行爲型模式之解釋器模式

解釋器模式

概述


給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

適用性


當有一個語言需要解釋執行,並且你可將該語言中的句子表示爲一個抽象語法樹時,可使
用解釋器模式。而當存在以下情況時該模式效果最好:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章