设计模式之解释器模式

文章目录

定义

解释器模式(Interpreter Pattern)是一种行为设计模式,它提供了一种方式来表示语言或表达式的语法,并定义了如何解释这些表达式来执行特定任务。这种模式常用于小型语言或简单的表达式解析,例如配置文件、SQL查询构建器或者计算表达式等。

解释器模式的关键组件包括:

  • Expression(表达式): 抽象表达式接口,定义了一个interpret方法,用于解释表达式。
  • AbstractExpression(抽象表达式): 为所有具体表达式提供一个公共接口,通常包含interpret方法的实现。
  • TerminalExpression(终结符表达式): 实现与语言中的原子元素对应的解释行为。
  • NonTerminalExpression(非终结符表达式): 处理更复杂的语言结构,通常由其他表达式组成。
  • Context(上下文): 提供了环境信息,解释器需要从上下文中获取数据或向其写入数据。

示例代码

java 复制代码
public interface Expression {
    int interpreter(Map<String, Integer> variables);
}
java 复制代码
public abstract class AbstractExpression implements Expression {
    protected Expression left;
    protected Expression right;

    public AbstractExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
}
java 复制代码
public class AddExpression extends AbstractExpression {
    public AddExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter(Map<String, Integer> variables) {
        return super.left.interpreter(variables) + super.right.interpreter(variables);
    }
}
java 复制代码
public class SubExpression extends AbstractExpression {
    public SubExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter(Map<String, Integer> variables) {
        return super.left.interpreter(variables) - super.right.interpreter(variables);
    }
}
java 复制代码
public class VarExpression implements Expression {
    private String key;

    public VarExpression(String key) {
        this.key = key;
    }

    @Override
    public int interpreter(Map<String, Integer> variables) {
        return variables.get(key);
    }
}
java 复制代码
public class Calculator {
    private Expression expression;

    public Calculator(String expStr) {
        Stack<Expression> stack = new Stack<>();
        char[] charArray = expStr.toCharArray();
        Expression left;
        Expression right;
        for (int i = 0; i < charArray.length; i++) {
            switch (charArray[i]) {
                case '+':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new AddExpression(left, right));
                    break;
                case '-':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new SubExpression(left, right));
                    break;
                default:
                    stack.push(new VarExpression(String.valueOf(charArray[i])));
            }
        }
        this.expression = stack.pop();
    }

    public int run(Map<String, Integer> variables) {
        return this.expression.interpreter(variables);
    }
}

源码地址

https://gitee.com/youxiaxiaomage/java-practices/tree/master/yxxmg-gof-sample/src/main/java/com/yxxmg/gof/behavior/interpreter

相关推荐
兵慌码乱7 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵9 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio12 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636714 小时前
使用 Python 从零创建 Word 文档
python
Csvn18 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽19 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户5569188175321 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
槑有老呆21 小时前
别再手搓 Prompt 了,那个叫"手动挡循环"
设计模式
兵慌码乱1 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei2 天前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python