设计模式之解释器模式的学习思考

来源:互联网 发布:视频播放器编程 编辑:程序博客网 时间:2024/05/16 13:01
解释器模式,就跟它的名字一样,起到解释的作用,比如对一个表达式进行解释,使其能够被人们所理解,属于设计模式里的行为型模式一种这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。优点: - 可扩展性比较好,灵活。 - 增加了新的解释表达式的方式。  - 易于实现简单文法。缺点: - 可利用场景比较少。 - 对于复杂的文法比较难维护。  - 解释器模式会引起类膨胀。  - 解释器模式采用递归调用方法。

设计:

  • 一个接口,定义表达式
  • 实现接口,分实现类为表达式定义类和规则定义类
  • main方法实现调用

代码:

//创建一个表达式接口interface Expression{    boolean interpret(String context);}class TerminalExpression implements Expression{    private String data;    public TerminalExpression(String data) {        this.data=data;    }    public boolean interpret(String context){        if(context.contains(data)){            return true;        }        return false;    }}class OrExpression implements Expression{    private Expression expr1=null;    private Expression expr2=null;    public OrExpression(Expression expr1, Expression expr2) {        super();        this.expr1 = expr1;        this.expr2 = expr2;    }    public boolean interpret(String context){        return expr1.interpret(context)||expr2.interpret(context);    }}class AndExpression implements Expression{    private Expression expr1=null;    private Expression expr2=null;    public AndExpression(Expression expr1, Expression expr2) {        super();        this.expr1 = expr1;        this.expr2 = expr2;    }    public boolean interpret(String context) {        return expr1.interpret(context)&&expr2.interpret(context);    }}public class InterpreterPatternDemo {    public static Expression getFruitExpression() {        //规则:苹果和橘子是水果(或)        Expression apple=new TerminalExpression("Apple");        Expression orange=new TerminalExpression("Orange");        return new OrExpression(apple, orange);    }    //规则  女朋友很能吃(且)    public static Expression getEatAmieExpression(){        Expression amie=new TerminalExpression("女朋友");        Expression eat=new TerminalExpression("能吃");        return new AndExpression(amie,eat);    }    public static void main(String[] args) {        Expression isFruit=getFruitExpression();        Expression isAmie=getEatAmieExpression();        System.out.println("苹果是水果吗:"+isFruit.interpret("Apple"));        System.out.println("女朋友都能吃吗:"+isAmie.interpret("女朋友  能吃"));    }}

输出:

    苹果是水果吗:true    女朋友都能吃吗:true