首页 > 其他 > 详细

设计模式之解释器模式

时间:2020-04-10 19:12:36      阅读:77      评论:0      收藏:0      [点我收藏+]

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:运行程序,观察结果

技术分享图片

 

设计模式之解释器模式

原文:https://www.cnblogs.com/vincentYw/p/12675190.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!