版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1021979964/article/details/88428345
解释器模式(Interpreter)
解释器模式是一种不常使用的设计模式,用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计。
当需要开发一种新的语言时,可以考虑使用解释器模式。
尽量不要使用解释器模式,后期维护会很麻烦,在项目中,可以使用Jruby,Groovy,Java的JS引擎来替代解释器的作用,弥补java语言的不足之处。
角色构成:
AbstractExpression:抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
TerminalExpression:终结符表达式。实现与文法中的终结符想法的解释操作,实现抽象表达式中所要求的方法。文法中每个终结符表达式与之相对应。比如公式Z=X+Y,X和Y是终结符,对应解析X和Y的解释器就是终结符表达式。
NonterminalExpression:非终结符表达式。为文法中的非终结符相关的解释操作。
Context:环境类。包含解释器之外的全局信息。
Client:客户端类。
AbstractExpression
package com.kevin.行为型模式.解释器模式.interpreter;
/**
* @author kevin
* @version 1.0
* @description 表达式接口
* @createDate 2019/3/3
*/
public interface Expression {
public boolean interpret(String context);
}
TerminalExpression
package com.kevin.行为型模式.解释器模式.interpreter;
/**
* @author kevin
* @version 1.0
* @description 终结符表达式,实现表达式的实体类
* @createDate 2019/3/3
*/
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;
}
}
NonterminalExpression
package com.kevin.行为型模式.解释器模式.interpreter;
/**
* @author kevin
* @version 1.0
* @description 操作符,非终结表达式
* @createDate 2019/3/3
*/
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);
}
}
package com.kevin.行为型模式.解释器模式.interpreter;
/**
* @author kevin
* @version 1.0
* @description 操作符,非终结表达式
* @createDate 2019/3/3
*/
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);
}
}
测试解释器模式
package com.kevin.行为型模式.解释器模式.interpreter;
/**
* @author kevin
* @version 1.0
* @description 测试解释器模式
* @createDate 2019/1/18
*/
public class Test {
//规则: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"));
}
}
开发中常见的场景
- EL表达式式的处理
- 正则表达式解释器
- SQL语法的解释器
- 数学表达式解析器
- 如现成的工具包:Math Expression String Parser、Expression4J等。