设计模式学习笔记--解释器模式

来源:互联网 发布:仿淘宝商城系统源码 编辑:程序博客网 时间:2024/06/07 05:58

十六、解释器模式

解释器模式(interpreter pattern)提供了评估语言的语法或表达式的方式,通过实现接口来解释一个特定的上下文,常用语sql解析,符号处理等。
- 优点:可扩展性好、灵活,易于实现简单文法。
- 缺点:可用场景比较少,复杂文法难于维护。

实现

创建一个解释接口Expression和实现类,具体的解释规则。定义一个主要的解释器,和其他的组合表达式类。
interpreter
- 创建接口

IExpression.java

/** * Created by lenovo on 2016/11/30 0030. * 解释器接口 */public interface IExpression {    public boolean interpret(String context);}
  • 实现接口

TerminalExpression.java

/** * Created by lenovo on 2016/11/30 0030. * 解释器实现类 */public class TerminalExpression implements IExpression{    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.java

/** * Created by lenovo on 2016/11/30 0030. * OR逻辑的解释器 */public class OrExpression implements IExpression{    private IExpression exp1 = null;    private IExpression exp2 = null;    public OrExpression(IExpression exp1,IExpression exp2){        this.exp1 = exp1;        this.exp2 = exp2;    }    @Override    public boolean interpret(String context) {        return exp1.interpret(context) || exp2.interpret(context);    }}

AndExpression.java

/** * Created by lenovo on 2016/11/30 0030. * AND逻辑的解释器 */public class AndExpression implements IExpression{    private IExpression exp1 = null;    private IExpression exp2 = null;    public AndExpression(IExpression exp1, IExpression exp2){        this.exp1 = exp1;        this.exp2 = exp2;    }    @Override    public boolean interpret(String context) {        return exp1.interpret(context) && exp2.interpret(context);    }}
  • 演示

InterpreterPatternDemo.java

/** * Created by lenovo on 2016/11/30 0030. * 解释器演示 */public class InterpreterPatternDemo {    //规则,robert和john是男性    public static IExpression getMaleExpression(){        IExpression robert = new TerminalExpression("Robert");        IExpression john = new TerminalExpression("John");        return new OrExpression(robert,john);    }    //规则,julie 是已婚女性    public static IExpression getMarriedWomanExpression(){        IExpression julie = new TerminalExpression("Julie");        IExpression married = new TerminalExpression("Married");        return new AndExpression(julie,married);    }    public static void main(String[] args){        IExpression isMale = getMaleExpression();        IExpression isMarriedWoman = getMarriedWomanExpression();        //就是用context的上下文,去匹配定义的规则,若满足,则是符合指令。        System.out.println("John is male ? "+isMale.interpret("John"));        System.out.println("Julie is a married woman ? "+isMarriedWoman.interpret("Married Julie"));    }}
  • 输出
John is male ? trueJulie is a married woman ? true
0 0
原创粉丝点击