笔头云 笔头云
首页
设计模式
SQL教程
Redis
归档
关于
友链

笔头云

非淡泊无以明志,非宁静无以致远。
首页
设计模式
SQL教程
Redis
归档
关于
友链
  • 设计原则
  • 设计模式
  • 单例模式
  • 工厂模式
  • 建造者模式
  • 原型模式
  • 适配器模式
  • 代理模式
  • 装饰器模式
  • 门面模式
  • 桥接模式
  • 享元模式
  • 组合模式
  • 策略模式
  • 模板方法模式
  • 观察者模式
  • 责任链模式
  • 状态模式
  • 迭代器模式
  • 访问者模式
  • 中介模式
  • 命令模式
  • 解释器模式
    • 定义
    • 结构
    • 工作原理
    • 优点
    • 缺点
    • 应用场景
    • 示例代码
  • 备忘录模式
  • 设计模式
笔头云
2023-11-07
目录

解释器模式

# 解释器模式

# 定义

解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义语言的文法(语法)规则,并解析和执行语言中的表达式。该模式将一个复杂的问题拆分成一系列简单的表达式,然后通过解释器来解释和执行这些表达式。

# 结构

抽象表达式(Abstract Expression):定义了解释器的接口,声明了解释方法 interpret()。
终结符表达式(Terminal Expression):实现了抽象表达式接口,表示语言中的终结符,不再进行进一步解释。
非终结符表达式(Non-Terminal Expression):实现了抽象表达式接口,表示语言中的非终结符,需要进一步解释。
上下文(Context):包含解释器解释的信息,对于不同的表达式,上下文可以提供不同的解释环境。
客户端(Client):构建语言表达式的语法树,并调用解释器进行解释和执行。

解释器模式

- img: https://bitouyun.com/images/design-pattern/intercepter.png
  link: https://bitouyun.com/images/design-pattern/intercepter.png
  name: 解释器模式
1
2
3

# 工作原理

1.定义语言的文法规则,并将其表示为抽象语法树(Abstract Syntax Tree)。
2.创建终结符和非终结符表达式的类,实现抽象表达式接口。
3.根据语法规则,将表达式组织成一个抽象语法树。
4.客户端创建上下文对象,并将其传递给解释器进行解释和执行。
5.解释器递归地遍历抽象语法树,并根据每个节点的类型进行相应的处理。终结符表达式直接解释并返回结果,非终结符表达式调用子表达式的解释方法。
6.解释器逐步解释整个表达式,最终得到结果。

# 优点

灵活性和扩展性: 解释器模式通过定义语言的文法规则,可以灵活地扩展和改变语言的表达能力,添加新的表达式和操作符非常方便。
可维护性: 解释器模式将每个表达式都封装成独立的类,使得代码结构清晰,易于理解和维护。
易于实现语法规则: 解释器模式将语法规则映射到类的层次结构中,使得语法规则的定义和解释器的实现分离,易于理解和管理。
可扩展性: 可以通过组合不同的表达式来创建复杂的语法规则,而不需要修改现有的代码。

# 缺点

复杂性: 解释器模式的设计比较复杂,特别是对于复杂的语法规则,需要构建相应的抽象语法树,可能会增加系统的复杂性。
执行效率低: 解释器模式通常采用递归调用的方式对表达式进行解释,这可能会导致性能上的损失。
维护困难: 如果语言的文法规则发生变化,可能需要修改解释器的代码,维护和调试复杂的解释器可能会变得困难。

# 应用场景

需要解释执行,并且语言的表达式相对简单时,解释器模式可以将语言的文法规则映射到类的层次结构中,每个表达式都可以由相应的解释器来解释执行。
构建一个简单的语言解释器,解释器模式提供了一种结构化的方式来解释和执行语言中的表达式,可以将复杂的语法规则拆分成简单的表达式,并组合成复杂的语法规则。
灵活地扩展和改变语言的表达能力,解释器模式通过定义语言的文法规则,可以方便地添加新的表达式和操作符,扩展语言的功能。
对语言进行解析和处,解释器模式可以用于解析和处理各种领域特定语言(DSL)或配置文件,例如正则表达式解析、编译器的语法分析阶段、数据库查询语言的解析等。

# 示例代码

场景

使用解释器模式实现一个简单的日期格式化器,将日期格式化成不同的格式:yyyyMMdd,yyyy-MM-dd和yyyy/MM/dd

    /**
     * 抽象表达式
     */
    public interface Expression {
      // 解释
      String interpret(Date date);
    }
    
    1
    2
    3
    4
    5
    6
    7
    /**
     * 年份表达式类
     */
    public class YearExpression implements Expression {
    
      // 解释
      @Override
      public String interpret(Date date) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
        return dateFormat.format(date);
      }
    }
    
    /**
     * 月份表达式类
     */
    public class MonthExpression implements Expression {
      @Override
      public String interpret(Date date) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
        return dateFormat.format(date);
      }
    }
    
    /**
     * 日期表达式类
     */
    public class DayExpression implements Expression {
      @Override
      public String interpret(Date date) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd");
        return dateFormat.format(date);
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    /**
     * 测试类
     */
    @Slf4j
    public class Client {
      public static void main(String[] args) {
        Date date = new Date();
        // 构建年、月、日表达式
        Expression yearExpression = new YearExpression();
        Expression monthExpression = new MonthExpression();
        Expression dayExpression = new DayExpression();
    
        // 格式化日期
        log.info("格式化日期(yyyyMMdd):{}", yearExpression.interpret(date) + monthExpression.interpret(date) + dayExpression.interpret(date));
        log.info("格式化日期(yyyy-MM-dd):{}", yearExpression.interpret(date) + "-" + monthExpression.interpret(date) + "-" + dayExpression.interpret(date));
        log.info("格式化日期(yyyy/MM/dd):{}", yearExpression.interpret(date) + "/" + monthExpression.interpret(date) + "/" + dayExpression.interpret(date));
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // Make sure to add code blocks to your code group
    #行为型模式#设计模式
    上次更新: 2023/11/17, 09:38:49
    命令模式
    备忘录模式

    ← 命令模式 备忘录模式→

    最近更新
    01
    FRP内网穿透docker部署 工具
    05-07
    02
    Office Util办公工具 工具
    01-14
    03
    Git常用命令
    01-16
    更多文章>
    Theme by Vdoing | Copyright © 2023-2025 鲁ICP备2023014898号 公安备案号:37020302372159
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×