GoF23种设计模式之行为型模式之解释器模式

一、概述

        给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子。

二、适用性               

        当需要解释一种语言,并且可以将该语言中的句子表示为一个抽象语法树的时候。

1.该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。

2.效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。

三、参与者

1.AbstractExpression:声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
2.TerminalExpression: 实现与文法中的终结符相关联的解释操作。一个句子中的每个终结符需要该类的一个实例。
3.NonterminalExpression:为文法中的非终结符实现解释(Interpret)操作。
4.Context:包含解释器之外的一些全局信息。
5.Client:构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。调用解释操作。

四、类图


五、示例

AbstractExpression

package cn.lynn.interpreter;

public abstract class Language {

    public abstract void interpret();

}
Expression
package cn.lynn.interpreter;

public class English extends Language {

    @Override
    public void interpret() {
        System.out.println("为网页添加英文解释器!");
    }

}
package cn.lynn.interpreter;

public class Chinese extends Language {

    @Override
    public void interpret() {
        System.out.println("为网页添加中文解释器!");
    }

}
Context
package cn.lynn.interpreter;

import java.util.ArrayList;
import java.util.List;

public class Page {

    private String content;

    private List<Language> list = new ArrayList<Language>();

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public void addLanguage(Language lang) {
        list.add(lang);
    }

    public List<Language> getLanguages() {
        return list;
    }
}
Client
package cn.lynn.interpreter;

public class Client {

    public static void main(String[] args) {
        Page page = new Page();
        page.addLanguage(new English());
        page.addLanguage(new Chinese());
        
        for (Language lang : page.getLanguages()) {
            lang.interpret();
        }
    }

}
Result
为网页添加英文解释器!
为网页添加中文解释器!
posted @ 2013-06-03 14:41  Innosight  阅读(180)  评论(0编辑  收藏  举报