【每日一记】设计模式——解释器模式
2016-12-26 19:26
302 查看
概述
定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子适用场景:
可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
一些重复出现的问题可以用一种简单的语言来进行表达
一个简单语法需要解释的场景
实现
// 表达式接口 public interface Expression { boolean interpret(Context ctx); } // 与 public class And implements Expression { private Expression left; private Expression right; public And(Expression left, Expression right) { this.left = left; this.right = right; } @Override public boolean interpret(Context ctx) { return left.interpret(ctx) && right.interpret(ctx); } @Override public String toString() { return "(" + left.toString() + " && " + right.toString() + ")"; } } // 或 public class Or implements Expression { private Expression left; private Expression right; public Or(Expression left, Expression right) { this.left = left; this.right = right; } @Override public boolean interpret(Context ctx) { return left.interpret(ctx) || right.interpret(ctx); } @Override public String toString() { return "(" + left.toString() + " || " + right.toString() + ")"; } } // 非 public class Not implements Expression { private Expression ex; public Not(Expression ex) { this.ex = ex; } @Override public boolean interpret(Context ctx) { return !ex.interpret(ctx); } @Override public String toString() { return "!(" + ex + ")"; } } // 变量 public class Variable implements Expression { private String name; public Variable(String name) { this.name = name; } @Override public boolean interpret(Context ctx) { return ctx.lookup(this); } @Override public int hashCode() { return toString().hashCode(); } @Override public boolean equals(Object o) { if (o != null && o instanceof Variable) { return this.name.equals(((Variable) o).name); } return false; } @Override public String toString() { return name; } } // 常量 public class Constant implements Expression { private boolean b; public Constant(boolean b) { this.b = b; } @Override public boolean interpret(Context ctx) { return b; } @Override public String toString() { return String.valueOf(b); } }
// 上下文,存储变量 public class Context { private Map<Variable, Boolean> m = new HashMap<>(); public void assign(Variable var, boolean value) { m.put(var, new Boolean(value)); } public boolean lookup(Variable var) { return m.get(var); } }
// 客户端 public class Client { public static void main(String[] args) throws Exception { Context ctx = new Context(); Variable a = new Variable("a"); Variable b = new Variable("b"); ctx.assign(a, true); ctx.assign(b, false); Constant c1 = new Constant(true); Constant c2 = new Constant(false); Expression ex = new Or(new And(a, new And(c2, b)), new Not(c1)); System.out.println(ex); System.out.println(ex.interpret(ctx)); } }
输出结果
((a && (false && b)) || !(true))
false
解释器模式带来了良好的扩展性,修改语法规则只要修改相应的非终结符表达式,若扩展语法,则只需增加非终结符类,但是由于大量的循环和递归可能会引发一定的效率问题
相关文章推荐
- 设计模式学习-每日一记(4.抽象工厂)
- 设计模式学习-每日一记(1.简单工厂模式)
- 设计模式学习-每日一记(17.解释器模式)
- 【每日一记】设计模式——适配器模式
- 【每日一记】设计模式——原型模式
- 设计模式学习-每日一记(9.装饰者模式)
- 设计模式学习-每日一记(22.访问者模式)
- 设计模式学习-每日一记(23.责任链模式)
- 【每日一记】设计模式——装饰器模式
- 设计模式学习-每日一记(2.外观模式)
- 设计模式学习-每日一记(7.适配器模式)
- 设计模式学习-每日一记(15.状态模式)
- 设计模式学习-每日一记(6.原型模式)
- 设计模式学习-每日一记(20.中介者模式)
- 设计模式学习-每日一记(8.桥接模式)
- 设计模式学习-每日一记(13.策略模式)
- 设计模式学习-每日一记(14.观察者模式)
- 【每日一记】设计模式——建造者模式
- 【每日一记】设计模式——工厂模式
- 设计模式学习-每日一记(5.创建者模式)