注意:所有文章除特别说明外,转载请注明出处.
简介
该模式提供了评估语言的语法或表达式的方式。此模式实现了一个表达式接口,该接口解释一个特定的上下文。在编程中需要分析一件事情,并决定其含义所以需要解释器模式来完成。
此模式基于表达式和评估器部分。第一个代表要分析的事情,该分析是由评价者做出,它们知道构成表达的人物的意义。
为了解释一种语言而为语言创建的解释器。
场景
1. 某个特定类型问题发生频率足够高的时候
优点
1. 语法由很多类表示,容易改变和扩展此语言
缺点
1. 当语法规则数目太多时,增加了系统的复杂度
相关设计模式
1. 解释器模式和适配器模式
解释器模式
1.创建表达式接口(抽象表达式类)
public interface Expression {
//解释方法
public boolean interpret(String context);
}
2.创建实现上述接口的实体类(终结表达式类)
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data){
this.data = data;
}
//对终结表达式的处理
@Override
public boolean interpret(String context) {
if(context.contains(data)){
return true;
}
return false;
}
}
public class OrExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
public class AndExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
3.InterpreterPatternDemo 使用 Expression 类来创建规则 并解析它们
public class InterpreterPatternDemo {
//规则:Robert 和 John 是男性
public static Expression getMaleExpression(){
Expression robert = new TerminalExpression("Robert");
Expression john = new TerminalExpression("John");
return new OrExpression(robert, john);
}
//规则:Julie 是一个已婚的女性
public static Expression getMarriedWomanExpression(){
Expression julie = new TerminalExpression("Julie");
Expression married = new TerminalExpression("Married");
return new AndExpression(julie, married);
}
public static void main(String[] args) {
Expression isMale = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("John is male? " + isMale.interpret("John"));
System.out.println("Julie is a married women? "
+ isMarriedWoman.interpret("Married Julie"));
}
}
总结
解释器模式包含以下主要角色:
1.抽象表达式:定义解释器的接口,约定解释器的解释操作,主要包含方法:intercept()。
2.终结符表达式:抽象表达式的子类,实现文法中与终结符相关的操作。
3.非终结符表达式:抽象表达式的子类,用来实现文法中与非终结符相关的操作。
4.环境:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据。
5.客户端:验证正确与否