博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 之 解释器模式
阅读量:5942 次
发布时间:2019-06-19

本文共 2787 字,大约阅读时间需要 9 分钟。

hot3.png

设计模式 之 解释器模式

介绍

角色:

主要包含如下几个角色:

  • Expression: 抽象表达式。
  • TerminalExpression: 终结符表达式 - 就是符号表达式。
  • NonTerminalExpression: 非终结符表达式 - 数字表达式。
  • Calculator: 计算类。

代码

代码场景

解释器来实现加、减运算。

具体代码

Expression

/** * 抽象解释器 AbstractExpression * @author GaoYuan * @date 2018/11/11 上午8:38 */public abstract class Expression {    /** 解释动作 */    public abstract int interpret();}

ValueExpression - 解释 数字

/** * 数字解释器(具体值) TerminalExpression * @author GaoYuan * @date 2018/11/11 上午8:44 */public class ValueExpression extends Expression {    private int value;    public ValueExpression(){}    public ValueExpression(int value){        this.value = value;    }    public int getValue() {        return value;    }    public void setValue(int value) {        this.value = value;    }    @Override    public int interpret() {        return this.value;    }}

SymbolExpression - 解释 运算符(抽象)

/** * 运算符 解释器 NonterminalExpression * @author GaoYuan * @date 2018/11/11 上午8:43 */public abstract class SymbolExpression extends Expression {    /** 左结果 */    protected Expression left;    /** 右结果 */    protected Expression right;    public SymbolExpression(Expression left, Expression right) {        this.left=left;        this.right=right;    }}

具体运算符的解释类

/** * 加法 * @author GaoYuan * @date 2018/11/11 下午1:43 */public class AddExpression extends SymbolExpression {    /** 这里肯定传入的是值类型,而不是符号 */    public AddExpression(Expression left, Expression right){        super(left, right);    }    @Override    public int interpret() {        // left解释成left的值,right解释成right的值        return left.interpret() + right.interpret();    }}/** * 减法 * @author GaoYuan * @date 2018/11/11 下午1:43 */public class SubExpression extends SymbolExpression {    /** 这里肯定传入的是值类型,而不是符号 */    public SubExpression(Expression left, Expression right){        super(left, right);    }    @Override    public int interpret() {        // left解释成left的值,right解释成right的值        return left.interpret() - right.interpret();    }}

Calculator - 计算类,解释完后需要进行计算

/** * 计算 * @author GaoYuan * @date 2018/11/11 下午1:50 */public class Calculator {    /**     * 计算     * @author GaoYuan     * @date 2018/11/11 下午2:01     */    public int calculator(String statement){        Expression left;        Expression right;        // 用于存储当前已经计算的值        Expression now = null;        // 空格隔开的数据,进行截取成数组        String[] strs = statement.split(" ");        for(int i=0;i

测试类

public static void main(String[] args){    String statement = "1 + 2 + 3 - 5";    Calculator calculator = new Calculator();    int result = calculator.calculator(statement);    System.out.println(statement + " = " + result);}

输出

1 + 2 + 3 - 5 = 1

优缺点

优点:

  • 符号解释类可扩展,比如可以添加乘法、除法等运算符
  • 可用于对SQL的解释等。

缺点:

  • 因为需要解释的过程,所以比较耗时。
  • 表达式过长就不易于维护。
  • 场景比较少。

码云

博客

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

转载于:https://my.oschina.net/gmarshal/blog/2964024

你可能感兴趣的文章
终于拿证了
查看>>
SecureCRT从Windows中上传文件lrzsz工具
查看>>
socket的阻塞非阻塞方法在缓冲区的差别
查看>>
动态rem与1px边框问题的理解
查看>>
PyQt 编程基本思想-HelloWorld
查看>>
Access restriction: The type Unsafe is not accessible due to restriction on required library
查看>>
Ruby错误:iconv will be deprecated in the future, use String#encode instead.
查看>>
SmsManager#sendTextMessage的BUG
查看>>
Brocade光纤交换机FOS升级
查看>>
linux哲学思想
查看>>
我的友情链接
查看>>
如何安全设置无线路由
查看>>
什么是iSCSI
查看>>
SSL应用系列之二:为Web站点实现SSL加密访问
查看>>
2014年十大战略性技术趋势
查看>>
vsftp 550,227 报错解决
查看>>
MSSQL2000+asp.net+论坛安装过程
查看>>
Citrix Xendesktop中VDA注册DDC的流程
查看>>
修改Jetty端口
查看>>
nginx参数配置(3)待续
查看>>