Java的23种设计模式---(16)解释器模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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"));
    }
}

开发中常见的场景

  1. EL表达式式的处理
  2. 正则表达式解释器
  3. SQL语法的解释器
  4. 数学表达式解析器
  •  如现成的工具包:Math Expression String Parser、Expression4J等。

猜你喜欢

转载自blog.csdn.net/qq1021979964/article/details/88428345