设计模式26——解释器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

解释器模式(Interpreter)

类行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、代码举例

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:


一、概述

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

1.1、直观的理解

假设有2个解释器按顺序解释内容,那么:

可以看到内容被解释器一段一段的解释和翻译。

1.2、主要角色:

  • 解释器:++解释器的抽象类或接口++ + 具体的解释器实现类 (包括: ++终结符表达式++ + ++非终结符表达式++)
  • ++内容++(Context):被解释的内容
  • ++请求发起者++(Client)

1.3、描述对象之间关系的UML图:

1.4、适用场景:

1、如果一种特定类型的问题发送的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题;

2、可以更容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变或扩展该文法;

3、当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式;

4、典型的例子有:正则表达式;

5、因为解释器模式为文法中的每一条规则至少定义了一个类,所以文法非常复杂时,还是建议使用其他技术如语法分析程序或编译器生成器来处理。

(注:当效率不是关键问题时,才会用此模式,如正则表达式更多情况下是转换为状态机来实现的。状态机是什么?我一时也说不出来什么,不过你可以在练习编程算法的网站上找相关的题去学习题解或练习。)

二、代码举例

假设现有两个解释器用来解释字符串的内容。

这个例子比较简单,就不再详细分析了。但你可以把本例当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:

内容类:

java 复制代码
public class Context {
    private String input;

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

    private String output;

    public String getOutput() {
        return output;
    }

    public void setOutput(String output) {
        this.output = output;
    }
}

解释器的抽象类:

java 复制代码
abstract class AbstractExpression {
    public abstract void interpret(Context context);
}

解释器A:

java 复制代码
public class ConcreteExpressionA extends AbstractExpression {
    @Override
    public void interpret(Context context) {
        System.out.println("解释器A,处理中。。。。");
    }
}

解释器B:

java 复制代码
public class ConcreteExpressionB extends AbstractExpression {
    @Override
    public void interpret(Context context) {
        System.out.println("解释器B,处理中。。。。");
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        Context context = new Context();

        //核心是解释器如何处理内容,以下只是最简单的举例
        List<AbstractExpression> expressionList = new ArrayList<>();
        expressionList.add(new ConcreteExpressionA());
        expressionList.add(new ConcreteExpressionB());
        expressionList.add(new ConcreteExpressionA());
        expressionList.add(new ConcreteExpressionB());

        for (AbstractExpression abstractExpression : expressionList) {
            abstractExpression.interpret(context);
        }
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
linux-hzh3 小时前
设计模式之原型模式
设计模式·原型模式
蔡蓝4 小时前
设计模式-工厂方法模式
java·设计模式·工厂方法模式
linux-hzh4 小时前
设计模式之单例模式
单例模式·设计模式
QQ_hoverer5 小时前
Java设计模式之工厂模式与策略模式简单案例学习
java·开发语言·学习·设计模式·策略模式
master-dragon5 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
赵大仁6 小时前
Vue Hook Store 设计模式最佳实践指南
前端·vue.js·设计模式
on the way 1236 小时前
结构性设计模式之Bridge(桥接)
设计模式
梵高的代码色盘10 小时前
工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”
设计模式·策略模式
qqxhb11 小时前
零基础设计模式——结构型模式 - 享元模式
设计模式·享元模式·分离内外状态·共享对象
季鸢11 小时前
Java设计模式之命令模式详解
java·设计模式·命令模式