设计模式之解释器模式

定义(From百度百科):
        Interpreter(解释器)模式是一种特殊的设计模式,它建立一个解释器(Interpreter),
对于特定的计算机程序设计语言,用来解释预先定义的文法。
简单地说,Interpreter模式是一种简单的语法解释器构架。

 

UML类图:

 

抽象具体代码:

public class Client {
    public static void main(String[] args) {
        //
    }
}

public class Context {

}

public abstract class AbstractExpression {
    abstract void  interpret();
}

public class NonTerminal {

}

public class Terminal {

}

好吧这只是解释器模式的代码骨架
在此引用下wiki上的例子(不得不吐槽,就单独技术上,wiki比百度解释的不知道详细多少)

expression ::= plus | minus | variable | number
plus ::= expression expression '+'
minus ::= expression expression '-'
variable ::= 'a' | 'b' | 'c' | ... | 'z'
digit = '0' | '1' | ... | '9'
number ::= digit | digit number

interface Expression {
    public int interpret(final Map<String, Expression> variables);
}

class Number implements Expression {
    private int number;
    public Number(final int number)       { this.number = number; }
    public int interpret(final Map<String, Expression> variables)  { return number; }
}

class Plus implements Expression {
    Expression leftOperand;
    Expression rightOperand;
    public Plus(final Expression left, final Expression right) {
        leftOperand = left;
        rightOperand = right;
    }
        
    public int interpret(final Map<String, Expression> variables) {
        return leftOperand.interpret(variables) + rightOperand.interpret(variables);
    }
}

class Minus implements Expression {
    Expression leftOperand;
    Expression rightOperand;
    public Minus(final Expression left, final Expression right) {
        leftOperand = left;
        rightOperand = right;
    }
        
    public int interpret(final Map<String, Expression> variables) {
        return leftOperand.interpret(variables) - rightOperand.interpret(variables);
    }
}

class Variable implements Expression {
    private String name;
    public Variable(final String name)       { this.name = name; }
    public int interpret(final Map<String, Expression> variables) {
        if (null == variables.get(name)) return 0; // Either return new Number(0).
        return variables.get(name).interpret(variables);
    }
}

public class InterpreterExample {
    public static void main(final String[] args) {
        final String expression = "w x z - +";
        final Evaluator sentence = new Evaluator(expression);
        final Map<String, Expression> variables = new HashMap<String, Expression>();
        variables.put("w", new Number(5));
        variables.put("x", new Number(10));
        variables.put("z", new Number(42));
        final int result = sentence.interpret(variables);
        System.out.println(result);
    }
}

模块说明:
AbstractExpression(抽象表达式):在抽象表达式中声明了抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类。
Terminal(终结符表达式):终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解释操作,在句子中的每一个终结符都是该类的一个实例。
通常在一个解释器模式中只有少数几个终结符表达式类,它们的实例可以通过非终结符表达式组成较为复杂的句子。
NonTerminal(非终结符表达式):非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作,由于在非终结符表达式中可以包含终结符表达式,
也可以继续包含非终结符表达式,因此其解释操作一般通过递归的方式来完成。
Context(环境类):环境类又称为上下文类,它用于存储解释器之外的一些全局信息,通常它临时存储了需要解释的语句。

应用场景:
正如百度所言,正则表达式

优缺点:
优点:
易于改变和扩展文法
每一条文法规则都可以表示为一个类,因此可以方便地实现一个简单的语言
实现文法较为容易
增加新的解释表达式较为方便

缺点:
对于复杂文法难以维护
执行效率较低

总结:
分离实现,解释执行

吐槽:大部分我也不大明白,乱...,先留下个坑吧,希望有天把这句话去掉

posted @ 2017-08-21 18:00  重名  阅读(251)  评论(0编辑  收藏  举报