设计模式-解释器模式(Interpreter Pattern)

763 阅读2分钟

Github 源码地址

23种设计模式总览

创建型模式

结构型模式

行为型模式

定义

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

比命令模式更小众,只有在特定领域才会用到,如编译器、规则引擎、正则表达式、SQL等,而这类语言又称 领域特定语言 (Domain Specific Language, DSL)。

工作中很少会让我们去编写一个解释器,了解下即可,主要是借鉴思想 如何通过更简洁的规则来表示复杂逻辑

优缺点

优点:  1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。

缺点:  1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。

具体实现

步骤 1

创建一个表达式接口。

public interface Expression {
    public boolean interpreter(String content);
}

步骤 2

创建实现了上述接口的实体类。

public class TerminalExpression implements Expression {

    private String data;

    public TerminalExpression(String data) {
        this.data = data;
    }

    @Override
    public boolean interpreter(String content) {
        return content.contains(data);
    }
}
public class OrExpression implements Expression {

    private Expression expression1;
    private Expression expression2;

    public OrExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    @Override
    public boolean interpreter(String content) {
        return expression1.interpreter(content) || expression2.interpreter(content);
    }
}
public class AndExpression implements Expression {

    private Expression expression1;
    private Expression expression2;

    public AndExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    @Override
    public boolean interpreter(String content) {
        return expression1.interpreter(content) && expression2.interpreter(content);
    }
}

步骤 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.interpreter("John"));
        System.out.println("Julie is a married women? "
                + isMarriedWoman.interpreter("Married Julie"));
    }
}

步骤 4

执行程序,输出结果:

John is male? true
Julie is a married women? true

总结

解释器是一个比较少用的模式,如果确实遇到“一种特定类型的问题发生的频率足够高”的情况,准备使用解释器模式时,建议优先考虑一些成熟的第三方、开源的解析工具。