详解设计模式:解释器模式

news/2025/2/14 2:53:41/

解释器模式(interpreter pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

解释器模式 这种模式被用在 SQL 解析、符号处理引擎等。

解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

本篇文章内容包括:关于解释器模式、解释器模式 Demo(伪代码)


文章目录

    • 一、关于解释器模式
        • 1、关于解释器模式
        • 2、关于解释器模式的构成
        • 3、关于解释其模式的UML
        • 4、关于访问者模式的适用场景
        • 5、关于访问者模式的优缺点
    • 二、解释器模式 Demo(伪代码)
        • 1、伪代码 Demo 实现
        • 2、Demo 测试


一、关于解释器模式

1、关于解释器模式

解释器模式(interpreter pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

解释器模式 这种模式被用在 SQL 解析、符号处理引擎等。

解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

2、关于解释器模式的构成

解释器模式包含以下主要 5 种角色。

  • 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
  • 终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
  • 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
  • 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

3、关于解释其模式的UML

image-20221204212444708

4、关于访问者模式的适用场景

解释器模式在实际的软件开发中使用比较少,因为它会引起效率、性能以及维护等问题。

在 Jdk 中的正则表达式中的 Pattern 类和 Spring 里面的 ExpressionParse 接口使用的是解释器模式的思想。

当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释,整体来说还是一种应用较少的设计模式。

5、关于访问者模式的优缺点

# 访问者模式优点

  • 访问者模式增加新的操作很容易,只需要增加一个新的访问者即可;
  • 相关的行为,封装到一个访问者中;

# 访问者模式缺点

  • 增加新数据结构比较困难;
  • 元素变更比较困难,如为被访问的对象增加/减少一些属性,相应的访问者也需要进行修改。

二、解释器模式 Demo(伪代码)

1、伪代码 Demo 实现

# AbstractExpression 抽象表达式(Abstract Expression)角色

public abstract class AbstractExpression {/*** 解释方法* @param info String* @return boolean*/public abstract boolean interpret(String info);
}

# NonTerminalExpression 非终结符表达式(Nonterminal Expression)角色

public class NonTerminalExpression extends AbstractExpression {private AbstractExpression address = null;private AbstractExpression name = null;private AbstractExpression id = null;public NonTerminalExpression(AbstractExpression address, AbstractExpression name, AbstractExpression id) {this.address = address;this.name = name;this.id = id;}@Overridepublic boolean interpret(String info) {String[] strings = info.split("-");return address.interpret(strings[0]) && name.interpret(strings[1]) && id.interpret(strings[2]);}
}

# TerminalExpression 终结符表达式(Terminal Expression)角色

import java.util.HashSet;
import java.util.Set;public class TerminalExpression extends AbstractExpression {private final Set<String> set = new HashSet<String>();public TerminalExpression(String[] data) {for (int i = 0; i < data.length; i++)set.add(data[i]);}@Overridepublic boolean interpret(String info) {if (set.contains(info)) {return true;}return false;}
}

# Context 环境(Context)角色

public class Context {private final AbstractExpression information;public Context() {String[] number1 = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};AbstractExpression number = new TerminalExpression(number1);String[] xxZm1 = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"};AbstractExpression xxZm = new TerminalExpression(xxZm1);String[] dxZm1 = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"};AbstractExpression dxZm = new TerminalExpression(dxZm1);information = new NonTerminalExpression(number, xxZm, dxZm);}public void interpreter(String info) {boolean ok = information.interpret(info);if (ok) {System.out.println("正确! [" + info + "] 满足  [单个数字-单个小写-单个大写]  的条件");} else {System.out.println("错误! [" + info + "] 不满足  [单个数字-单个小写-单个大写]  的条件");}}}

2、Demo 测试

public class Client {public static void main(String[] args) {Context people = new Context();people.interpreter("2-a-A");people.interpreter("11-A-5");people.interpreter("你-好-吖");people.interpreter("2aA");}
}

http://www.ppmy.cn/news/2282.html

相关文章

Java高效率复习-数据类型和运算符[Java]

第一篇关于JavaSE内容的文章 文章的风格比较涣散&#xff0c;但是都是干货&#xff0c;关于Java系列的&#xff0c;还有就是&#xff0c;我认为只有MySQL基础和JavaSE基础是可以做到可操作性和可执行性较强的。 如果像JavaWeb或者SSM框架这些&#xff0c;光看文章你是根本执行…

gnn神经网络是什么,gnn神经网络代码

1、gnn什么意思? 指图形神经网络。 生物神经网络主要是指人脑的神经网络&#xff0c;它是人工神经网络的技术原型。人脑是人类思维的物质基础&#xff0c;思维的功能定位在大脑皮层&#xff0c;后者含有大约10^11个神经元。 每个神经元又通过神经突触与大约103个其它神经元…

vue - vue使用echarts实现中国地图和点击省份进行查看

文章目录1&#xff0c;实现的效果和功能2&#xff0c;安装ECharts3&#xff0c;main.js里面引入echarts4&#xff0c;实现如下5&#xff0c;遇到的问题6&#xff0c;用到的模拟数据1&#xff0c;实现的效果和功能 vue使用echarts实现中国地图和点击省份进行查看&#xff1b; 下…

【C++】C++11新特性

目录 一.列表初始化initializer_list 1.什么是列表初始化 2.列表初始化的原理 二.auto/decltype/nullptr 1.auto - 自动类型推导 2.decltype - 指定类型 3.nullptr - C空指针 三.范围for 四.右值引用/移动构造/移动赋值/万能引用/完美转发 1.什么是右值 2.左值与右值…

适用于嵌入式单片机的差分升级通用库+详细教程

1. 什么是差分/增量升级&#xff1f; 借用网上的介绍&#xff1a;适合嵌入式的差分升级又叫增量升级&#xff0c;顾名思义就是通过差分算法将源版本与目标版本之间差异的部分提取出来制作成差分包&#xff0c;然后在设备通过还原算法将差异部分在源版本上进行还原从而升级成目…

Python判断是否为字符串的程序是什么?

Python中如何判断是否为字符串?在python中&#xff0c;想要判断是否为字符串可以通过isinstance()函数来判断&#xff0c;接下来小编将通过示例为大家详细的介绍一下。 Python判断是否为字符串 >>> s abc >>> isinstance(s,basestring) #判断是否是字符串型…

试给出二叉树从下至上,从右至左的遍历算法

算法思想&#xff1a;根据层次遍历的顺序可得到与该问题相反的次序&#xff0c;则可利用栈先进后出的性质&#xff0c;按层次遍历输出各结点并压入栈中&#xff0c;出栈时访问结点即可得到从下至上从右边到左边的遍历算法 代码&#xff1a; void LeverOrder(BiTree T){ BiTr…

数据比较器,对比数据前后变化细节

前言 在开发的过程中&#xff0c;有时候需要对数据进行比对&#xff0c;来判断是否发生变化。如果一个字段一个字段比较&#xff0c;就太麻烦了。所以通过整合注解与反射的方式&#xff0c;实现一个通用的实体数据比较框架。 设计 使用注解&#xff0c;确定需要比较的属性。…