前言:解释器模式的意图给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。缺点:1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。
JAVA语言版解释器模式
创建解释器接口:
public interface Expression {
public boolean interpret(String context);
}
创建终端解析器:
public class TerminalExpression implements Expression{
private String data;
public TerminalExpression(String data) {
this.data = data;
}
@Override
public boolean interpret(String context) {
if (data.contains(context)){
return true;
}
return false;
}
}
创建组合解析器:
public class OrExpression implements Expression {
private Expression expressionOne = null;
private Expression expressionTwo = null;
public OrExpression(Expression expressionOne, Expression expressionTwo) {
this.expressionOne = expressionOne;
this.expressionTwo = expressionTwo;
}
@Override
public boolean interpret(String context) {
return expressionOne.interpret(context) || expressionTwo.interpret(context);
}
}
public class AndExpression implements Expression {
private Expression expressionOne = null;
private Expression expressionTwo = null;
public AndExpression(Expression expressionOne, Expression expressionTwo) {
this.expressionOne = expressionOne;
this.expressionTwo = expressionTwo;
}
@Override
public boolean interpret(String context) {
return expressionOne.interpret(context) && expressionTwo.interpret(context);
}
}
使用InterpreterPatternDemo类演示解释器模式:
public class InterpreterPatternDemo {
public static void main(String[] args) {
Expression exprOne =new TerminalExpression("abcdefgg");
Expression exprtwo =new TerminalExpression("ggmnxzy");
Expression orExpr =new OrExpression(exprOne,exprtwo);
Expression andExpr =new AndExpression(exprOne,exprtwo);
String dateOne ="abc";
String dateTwo ="gg";
System.out.println("dateOne分别用OrExpression与AndExpression解析:");
System.out.println(orExpr.interpret(dateOne));
System.out.println(andExpr.interpret(dateOne));
System.out.println("dateTwo分别用OrExpression与AndExpression解析:");
System.out.println(orExpr.interpret(dateTwo));
System.out.println(andExpr.interpret(dateTwo));
}
}
输出结果:
dateOne分别用OrExpression与AndExpression解析:
true
false
dateTwo分别用OrExpression与AndExpression解析:
true
true