首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >23种设计模式之解释器模式

23种设计模式之解释器模式

作者头像
紫风
发布2025-10-14 15:19:17
发布2025-10-14 15:19:17
1670
举报
解释器模式 (Interpreter Pattern) 详细介绍

一、模式概述
  • 英文名称:Interpreter
  • 核心目标定义一种语言的文法表示,并设计一个解释器来解释该语言中的句子,将语法规则映射为对象结构。
  • 设计思想:通过递归组合表达式对象,构建语法树,实现对特定领域语言(DSL)的解析和执行。

二、优缺点

优点

缺点

1. 灵活扩展语法:新增语法规则只需添加表达式类。

1. 类数量膨胀:复杂语法导致大量类。

2. 易于实现简单语言:如数学表达式、规则引擎。

2. 效率较低:递归解析可能影响性能。

3. 可读性强:语法规则与代码结构一一对应。

3. 处理复杂文法困难:需结合其他解析技术(如ANTLR)。


三、应用场景
  1. 数学公式解析:如四则运算、布尔表达式。
  2. 查询语言处理:如自定义SQL条件过滤。
  3. 规则引擎:业务规则的条件解析(如风控规则)。
  4. 配置文件解析:自定义配置格式的读取。

四、代码实现与注释
1. 抽象表达式接口
代码语言:javascript
复制
/**
 * 抽象表达式接口:定义 interpret 解释方法
 */
public interface Expression {
    int interpret(Context context);
}
2. 终结符表达式(变量和常量)
代码语言:javascript
复制
/**
 * 终结符表达式:变量(如 a、b)
 */
public class Variable implements Expression {
    private final String name;

    public Variable(String name) {
        this.name = name;
    }

    @Override
    public int interpret(Context context) {
        return context.getValue(this.name);
    }
}

/**
 * 终结符表达式:数字常量(如 5、10)
 */
public class Number implements Expression {
    private final int value;

    public Number(int value) {
        this.value = value;
    }

    @Override
    public int interpret(Context context) {
        return this.value;
    }
}
3. 非终结符表达式(运算符)
代码语言:javascript
复制
/**
 * 非终结符表达式:加法运算(如 a + b)
 */
public class Add implements Expression {
    private final Expression left;
    private final Expression right;

    public Add(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context) + right.interpret(context);
    }
}

/**
 * 非终结符表达式:减法运算(如 a - b)
 */
public class Subtract implements Expression {
    private final Expression left;
    private final Expression right;

    public Subtract(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context) - right.interpret(context);
    }
}
4. 上下文类(存储变量值)
代码语言:javascript
复制
import java.util.HashMap;
import java.util.Map;

/**
 * 上下文类:存储变量名与值的映射关系
 */
public class Context {
    private final Map<String, Integer> variables = new HashMap<>();

    // 设置变量值
    public void setVariable(String name, int value) {
        variables.put(name, value);
    }

    // 获取变量值
    public int getValue(String name) {
        Integer value = variables.get(name);
        if (value == null) throw new IllegalArgumentException("变量未定义: " + name);
        return value;
    }
}
5. 客户端调用(构建语法树)
代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        // 创建上下文并设置变量值
        Context context = new Context();
        context.setVariable("a", 10);
        context.setVariable("b", 5);

        // 构建表达式:(a + (b - 2)) 
        Expression expression = new Add(
            new Variable("a"),
            new Subtract(new Variable("b"), new Number(2))
        );

        // 解释执行表达式
        int result = expression.interpret(context);
        System.out.println("计算结果: " + result); // 输出 13
    }
}

五、模式结构图
代码语言:javascript
复制
+----------------+          +----------------+
|   Expression   | <------+ |   Context      |
+----------------+          +----------------+
| +interpret()   |          | +getValue()    |
+----------------+          +----------------+
       ^                           
       |                           
+----------------+          
| TerminalExpression | 
+----------------+          
| +interpret()   |          
+----------------+          
       ^                           
       |                           
+----------------+          
| NonTerminalExpression | 
+----------------+          
| -left:Expression      |
| -right:Expression     |
| +interpret()   |          
+----------------+        

六、与其他模式的关系
  1. 组合模式:解释器模式通过组合表达式构建语法树,类似组合模式的结构。
  2. 访问者模式:可用于遍历语法树并执行操作(如类型检查)。
  3. 工厂模式:通过工厂生成表达式对象,简化语法树构建。

七、最佳实践
  1. 分离语法解析与解释:使用解析器(如递归下降解析器)生成语法树,再交给解释器执行。
  2. 处理优先级与结合性:通过嵌套表达式结构实现运算符优先级(如乘除优先于加减)。
  3. 预编译优化:对频繁使用的表达式进行预编译,提升执行效率。

八、总结
  • 核心价值:将领域特定语言的语法规则映射为对象结构,实现灵活的解释执行。
  • 适用场景:需要定义简单领域语言并解析执行的系统(如规则引擎、公式计算)。
  • 关键实现:表达式接口 + 终结符/非终结符表达式类 + 上下文管理。

解释器模式在 Java 生态中的典型应用包括:

  • 正则表达式java.util.regex.Pattern 解析正则语法。
  • Spring SpEL:Spring 表达式语言解析执行。
  • 规则引擎:Drools 规则的条件解析。

掌握该模式能为特定领域问题提供高度定制化的解决方案,但需权衡其适用性与复杂度。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解释器模式 (Interpreter Pattern) 详细介绍
    • 一、模式概述
    • 二、优缺点
    • 三、应用场景
    • 四、代码实现与注释
      • 1. 抽象表达式接口
      • 2. 终结符表达式(变量和常量)
      • 3. 非终结符表达式(运算符)
      • 4. 上下文类(存储变量值)
      • 5. 客户端调用(构建语法树)
    • 五、模式结构图
    • 六、与其他模式的关系
    • 七、最佳实践
    • 八、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档