本文介绍23种设计模式之解释器模式。
定义
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。就是创建一个接口 Expression接口 有一个interpreter(String context) 的方法传递上下文到解释器中。
描述
- 模式名称:INTERPRETER(解释器)
- 类型:类行为型模式
- 意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 适用性:
- 当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
- 效果:
- 优点:
- 易于实现、改变和扩展文法。该模式使用类来表示文法规则 , 你可使用继承来改变或扩展该文法。
- 缺点:
- 对于复杂的文法比较难维护。解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。
类图
- 表达式(Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret(context)。
- 终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
- 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
实现代码
Expression
public interface Expression {
void interpret(String context);
}
Terminal Expression
public class QuackCommand implements Expression {
@Override
public void interpret(String context) {
System.out.println(context +"嘎嘎叫");
}
}
public class FlyCommand implements Expression {
@Override
public void interpret(String context) {
System.out.println(context+"飞行");
}
}
Nonterminal Expression
public class Sequence implements Expression {
private Expression expression1;
private Expression expression2;
public Sequence(Expression expression1,Expression expression2){
this.expression1 = expression1;
this.expression2 = expression2;
}
@Override
public void interpret(String context) {
//先执行表达式1,再执行表达式2
expression1.interpret(context);
expression2.interpret(context);
}
}
client
public class Client {
public static void main(String[] args) {
QuackCommand quackCommand = new QuackCommand();
FlyCommand flyCommand = new FlyCommand();
Sequence sequence = new Sequence(quackCommand, flyCommand);
sequence.interpret("duck");
}
}