设计模式系列——解释器模式

113 阅读1分钟

原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。

解释器模式经常用于语法翻译或者表达式解析,比如正则表达式解析,SQL语句解析等等。

举个例子

通过解释器模式实现一个,逻辑与和逻辑或的语法翻译器,同时实现一个Terminal翻译器,用于翻译问题内容。

来看一下解释器的UML类图 :

interpreter.png

再来看一下代码如何实现。

先定义一个语法表达式接口Expression

public interface Expression {
    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 (context.contains(data)){
            return true;
        }
        return false;
    }
}

OrExpression语法翻译器

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) || expr1.interpret(context);
    }
}

AndExpression语法翻译器

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);
    }
}

看一下客户端代码如何使用

public class InterpreterPatternDemo {

    //Rule: Robert and John are male
    public static Expression getMaleExpression(){
        Expression robert = new TerminalExpression("Robert");
        Expression john = new TerminalExpression("John");
        return new OrExpression(robert,john);
    }

    //Rule: Julie is a married women
    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"));
    }
}

总结

解释器模式是行为模式之一,如果一种特定类型的问题发生频率比较高,那么就可以把该问题的各种情况表述为一个简单的句子,然后通过构建解释器,通过解释器对这些情况进行翻译。

本文参考  www.tutorialspoint.com/design_patt…