设计模式之解释器模式
Interpret(解释器模式)
一、解释器模式简介
解释器模式(Interpreter)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等
核心:
- 1、对于一些固定文法构建一个解释句子的解释器
- 2、构建语法树,定义终结符与非终结符
- 3、构建环境类,包含解释器之外的一些全局信息,一般是 HashMap
二、解释器模式优缺点比较
优点:
- 1、可扩展性比较好,灵活
- 2、增加了新的解释表达式的方式
- 3、易于实现简单文法
缺点:
- 1、可利用场景比较少
- 2、对于复杂的文法比较难维护
- 3、解释器模式会引起类膨胀、解释器模式采用递归调用方法
使用场景:
- 1、EL表达式处理
- 2、正则表达式解析器、SQL语法解析器
注意事项:1、可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替
三、UML类图
四、设计实现
步骤1:创建解析器接口
public interface Expression { boolean interpreter(String Context); }
步骤2:创建实现解析器接口实体类
public class TerminalExpression implements Expression { private String date ; public TerminalExpression(String date) { this.date = date; } @Override public boolean interpreter(String Context) { if(Context.contains(date)) { return true; } return false; } } public class AndExpression implements Expression { private Expression e1; private Expression e2; public AndExpression(Expression e1, Expression e2) { this.e1 = e1; this.e2 = e2; } @Override public boolean interpreter(String Context) { return e1.interpreter(Context) && e2.interpreter(Context); } } public class OrExpression implements Expression{ private Expression e1; private Expression e2; public OrExpression(Expression e1, Expression e2) { this.e1 = e1; this.e2 = e2; } @Override public boolean interpreter(String Context) { return e1.interpreter(Context) || e2.interpreter(Context); } }
步骤3:调用者测试
public class InterpretDemo { //规则:Vicent 和 John 是男性 public static Expression isMale() { Expression e1 = new TerminalExpression("Vicent"); Expression e2 = new TerminalExpression("John"); return new OrExpression(e1, e2); } //规则:Forry 是一个已婚的女性 public static Expression isMarried() { Expression e1 = new TerminalExpression("Forry"); Expression e2 = new TerminalExpression("Married"); return new AndExpression(e1, e2); } public static void main(String[] args) { Expression isMale = isMale(); Expression isMarriedWoman = isMarried(); System.out.println("John is male? " + isMale.interpreter("John")); System.out.println("Julie is a married women? " + isMarriedWoman.interpreter("Married Julie")); } }
步骤4:运行程序,观察结果
posted on 2020-04-10 18:32 VincentYew 阅读(215) 评论(0) 收藏 举报