【设计模式学习笔记】解释器模式

解释器模式,最经典的解释器模型就是我们用的那些IDE。将你编写的语言转成机器语言。这个转换就可以理解为解释。

文章目录

          1.1 模型结构

          1.2 环境角色

          1.3 抽象表达式接口

          1.4 终结和非终结表达式实现

​​​​​​​          1.5 测试

​​​​​​​          1.6 结果

​​​​​​​          参考


1.1 模型结构

解释器模型,有三个主要的角色。

  1. Context:环境角色,主要用于存放传入的数据。
  2. AbstractExpress:抽象解释器,是所有解释器的接口或者抽象父类。
  3. TerminalExpress:终结符表达式,主要解释文法。
  4. NonTermianlExpress: 非终结符表达式,主要解释符号标记。

       比如:select * from database where name = #{name}
       select,from,where [a-z_A-Z]* =,是非终结表达式。database,*,#{name}这样的就属于终结表达式。
       下面看看我这个例子吧。笑笑就好~实在拙劣。。。
 

1.2 环境角色

package interpretor;

/************************************************
 *@ClassName : Context
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 13:24】
 *@Version : 1.0.0
 *************************************************/

public class Context {
    private String condition;
    private String value;
    private String expression;


    public Context(String condition, String value, String expression) {
        this.condition = condition;
        this.value = value;
        this.expression = expression;
    }

    public String getCondition() {
        return condition;
    }

    public String getValue() {
        return value;
    }

    public String getExpression() {
        return expression;
    }
}

1.3 抽象表达式接口

package interpretor;

/************************************************
 *@ClassName : Expression
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 9:27】
 *@Version : 1.0.0
 *************************************************/

public interface  Expression {
    void interpreter(Context context);
}

1.4 终结和非终结表达式实现

package interpretor;

/************************************************
 *@ClassName : TerminalExpression
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 9:29】
 *@Version : 1.0.0
 *************************************************/

public class TerminalExpression implements Expression {
    @Override
    public void interpreter(Context context) {
        String name = context.getCondition();
        String value = context.getValue();
        System.out.println("查询条件为name="+name);
        System.out.println("需要的结果是:"+value);
        if("age".equals(value) && "zhangsan".equals(name)){
            System.out.println("查询年龄为:23");
        }
    }

}

package interpretor;

/************************************************
 *@ClassName : NonTerminalExpression
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 9:29】
 *@Version : 1.0.0
 *************************************************/

public class NonTerminalExpression implements Expression {

    private Expression expression;

    public NonTerminalExpression(Expression expression) {
        this.expression = expression;
    }

    @Override
    public void interpreter(Context context) {
        String str = context.getExpression();
        if(str.contains("select") && str.contains("where")&& str.contains("=")){
            System.out.println("ooo条件查询");
            this.expression.interpreter(context);
        }
    }
}



1.5 测试

package interpretor;

/************************************************
 *@ClassName : Test
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/15 0015 9:30】
 *@Version : 1.0.0
 *************************************************/

public class Test {
    public static void main(String[] args) {
        String input = "select _value where name = _name";
        Context context = new Context("zhangsan", "age", input);

        Expression tExp = new TerminalExpression();
        Expression ntExp = new NonTerminalExpression(tExp);
        ntExp.interpreter(context);

    }
}

1.6 结果

 

参考

【菜鸟教程】:http://www.runoob.com/design-pattern/interpreter-pattern.html

本文原文地址:https://blog.csdn.net/baidu_30325009/article/details/85018820 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值