大话设计模式——20.解释器模式(Interpreter Pattern)

简介

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

UML图

在这里插入图片描述

应用场景
  • 某种特定类型的问题发生的频率足够多,就可能值得将该问题的各个实例表述为一个简单语言中的句子,通过构建解释器去解释这些句子来解决问题
  • 正则表达式、乐谱等

示例

乐谱的演奏

  1. Contex:
public class PlayContext {

    private String playText;

    public String getPlayText() {
        return playText;
    }

    public void setPlayText(String playText) {
        this.playText = playText;
    }
}
  1. interpreter:
public abstract class Expression {

    /**
     * 解释器
     */
    public void intercept(PlayContext context) {
         if(!context.getPlayText().isBlank()) {
            String playkey = context.getPlayText().substring(0, 1);
            context.setPlayText(context.getPlayText().substring(2));
            double playValue = Double.parseDouble(context.getPlayText().substring(0, context.getPlayText().indexOf(" ")));
            // 将前面两者移除
            context.setPlayText(context.getPlayText().substring(context.getPlayText().indexOf(" ") + 1));
            execute(playkey, playValue);
        }
    }

    /**
     * 执行
     *
     * @param playKey
     * @param playValue
     */
    public abstract void execute(String playKey, double playValue);
}

音符:

public class Note extends Expression {

    @Override
    public void execute(String playKey, double playValue) {
        String note = "";
        switch (playKey) {
            case "C":
                note = "1";
                break;
            case "D":
                note = "2";
                break;
            case "E":
                note = "3";
                break;
            case "F":
                note = "4";
                break;
            case "G":
                note = "5";
                break;
            case "A":
                note = "6";
                break;
            case "B":
                note = "7";
                break;
        }
        System.out.println(note);
    }
}

音域

public class Scale extends Expression {

    @Override
    public void execute(String playKey, double playValue) {
        String scale = "";
            switch ((int) playValue) {
                case 1:
                    scale = "低音";
                    break;
                case 2:
                    scale = "中音";
                    break;
                case 3:
                    scale = "高音";
                    break;
            }
        System.out.println(scale);
    }
}
  1. 运行
public class Main {

    public static void main(String[] args) {

        PlayContext context = new PlayContext();
        context.setPlayText("O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 ");
        Expression expression;
        while (!context.getPlayText().isBlank()){
            String str = context.getPlayText().substring(0, 1);
            switch (str){
                case "O":
                    expression = new Scale();
                    break;
                default:
                    expression = new Note();
                    break;
            }
            expression.intercept(context);
        }

    }
}

在这里插入图片描述

总结

  • 优点
    • 容易改变和扩展文法,该模式使用类来表示文法规则,可使用继承来改变或扩展文法
    • 容易实现文法,定义抽象语法树中各个节点的类实现大体类似易于编写
  • 缺点
    • 文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护
    • 文法复杂时建议使用其他如语法分析程序或编译器生成器等处理

相关推荐

  1. 解释模式(大话设计模式)C/C++版本

    2024-04-11 23:34:05       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-11 23:34:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-11 23:34:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-11 23:34:05       82 阅读
  4. Python语言-面向对象

    2024-04-11 23:34:05       91 阅读

热门阅读

  1. 每日一题 第八十八期 洛谷 滑动窗口

    2024-04-11 23:34:05       43 阅读
  2. leetcode26--删除有序数组中的重复项

    2024-04-11 23:34:05       30 阅读
  3. IntersectionObserver实现图片懒加载

    2024-04-11 23:34:05       37 阅读
  4. 【前端】CSS常用选择器总结

    2024-04-11 23:34:05       36 阅读
  5. POSTGRESQL——存储过程调试

    2024-04-11 23:34:05       41 阅读
  6. spring基本框架搭建(思路分享)

    2024-04-11 23:34:05       38 阅读
  7. ELK日志

    ELK日志

    2024-04-11 23:34:05      35 阅读
  8. 安装hadoop,9000端口访问不了

    2024-04-11 23:34:05       36 阅读
  9. SpringMVC初始化工程

    2024-04-11 23:34:05       35 阅读
  10. armbian 一键换源

    2024-04-11 23:34:05       39 阅读