百度百科

Interpreter模式

Interpreter(解释器)模式是一种特殊的设计模式,它建立一个解释器(Interpreter),对于特定的计算机程序设计语言,用来解释预先定义的文法。简单地说,Interpreter模式是一种简单的语法解释器构架。

Interpreter模式,即解释器模式。

解释器模式属于行为模式,Gof是这样定义的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

实例应用:正则表达式

例子

AbstractExpression(抽象表达式)
声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。

1
2
3
public abstract class Expression {
abstract void interpret(Context ctx);
}

TerminalExpression(终结符表达式)
实现与文法中的终结符相关联的解释操作。
一个句子中的每个终结符需要该类的一个实例。

1
2
3
4
5
6
public class SimpleExpression extends Expression {
@Override
void interpret(Context ctx) {
System.out.println("这是普通解析器");
}
}

NonterminalExpression(非终结符表达式)
为文法中的非终结符实现解释(Interpret)操作。

1
2
3
4
5
6
public class AdvanceExpression extends Expression {
@Override
void interpret(Context ctx) {
System.out.println("这是高级解析器");
}
}

Context(上下文)
包含解释器之外的一些全局信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.ArrayList;
import java.util.List;

public class Context {
private String content;
private List list = new ArrayList();

public String getContent() {
return content;
}

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

public void add(Expression eps){
list.add(eps);
}
public List getList(){
return list;
}
}

Client(客户)
构建(或被给定)表示该文法定义的语言中某个特定的句子的抽象语法树。
该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。调用解释操作。

1
2
3
4
5
6
7
8
9
10
11
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(Object eps: ctx.getList()){
((Expression)eps).interpret(ctx);
}
}
}

运行结果

1
2
3
这是普通解析器
这是高级解析器
这是普通解析器