Appearance
解释器模式
定义
定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
应用场景
- 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
- 当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当句子较为简单,且可使用静态语法分析程序解析的情况下,可使用语法分析程序实现更高效的解释操作。
优点
- 扩展性好。由于在解释器模式中采用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
- 容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。
缺点
- 对于复杂文法比较难维护。
- 解释器模式会引起类膨胀。每个语法规则都对应一个非终结符表达式,每一条规则至少需要定义一个类,因此可能会导致类个数急剧增加,从而增加系统实现的复杂度。
代码示例
java
public interface Expression {
Object interpret();
}
public class EntityExpression implements Expression{
private final Map<String,Object> value;
public EntityExpression(Map<String, Object> value) {
this.value = value;
}
@Override
public Object interpret() {
return value;
}
}
public class StringExpression implements Expression{
private final String value;
public StringExpression(String value) {
this.value = value;
}
@Override
public Object interpret() {
return value;
}
}
public class DotExpression implements Expression{
private final Expression entity;
private final Expression attr;
public DotExpression(Expression entity, Expression arr) {
this.entity = entity;
this.attr = arr;
}
@SuppressWarnings("unchecked")
@Override
public Object interpret() {
Map<String, Object> attrMap = (Map<String, Object>) entity.interpret();
String attrName = (String) attr.interpret();
return attrMap.get(attrName);
}
}
public class Client {
public static void main(String[] args) {
Map<String, Object> attrMap = new HashMap<>();
attrMap.put("attack", 10);
attrMap.put("health", 1000);
attrMap.put("defense", 6);
Expression expression = new DotExpression(new EntityExpression(attrMap), new StringExpression("attack"));
Object interpret = expression.interpret();
System.out.println(interpret);
}
}
结果
txt
10