【设计模式-行为型】解释器模式

devtools/2025/2/3 2:23:53/

一、什么是解释器模式

        到此为止23种解释器都将介绍完毕,下面说最后一个设计模式解释器模式。有许多谍战剧大家都会看过,在谍战剧中经常会有一些主要情节需要进行加密传递。间谍会接受或者发送加密信息。比如用收音机接收指令或者消息。间谍会根据特定的解码书去解码收音机传递过来的指令。同样的情节,在电视剧《潜伏》中也经常会出现。解释器模式为自定义语言的设计和实现提供了一种解决方案,它用于定义一组文法规则并通过这组文法规则来解释语言中的句子。虽然解释器模式的使用频率不是特别高,但是它在正则表达式、XML文档解释等领域还是得到了广泛使用。

二、为什么使用解释器模式

在电视剧《潜伏》中,地下党员通过特定的编码和通信方式进行情报传递,这种机制很好地体现了解释器模式的核心思想。通过解释器模式,我们可以模拟剧中情报的传递和解析过程,使得代码更加清晰和易于维护。

  • 需要灵活扩展的语言:地下党员们将密码语言的情报内容分解为基本元素并解释。在《潜伏》中,地下党员们经常需要传递秘密情报。这些情报往往以一种特殊的“密码语言”来表达,比如通过书信、暗号等方式。假设地下党员们使用一种简单的密码语言来传递信息,例如:“红色的花” 表示 “紧急行动”。“蓝色的信” 表示 “安全撤离”。“黄色的信封” 表示 “等待进一步指示”。这些密码语言可以看作是一种简单的“语言”,而情报的内容(如“红色的花”)可以看作是这种语言的“句子”。为了能够正确解释这些句子,地下党员们需要将其分解为更基本的元素(如“颜色”和“物品”),并根据预定义的规则进行解释。

  • 解析和执行简单语言:密码语言的规则简单,便于解释。在《潜伏》中,地下党员们使用的密码语言相对简单,只有几种颜色和物品的组合。这种简单的语言使得情报的传递和解释更加容易,同时也降低了被敌人破解的风险。

  • 用简单的语言来表达重复出现的问题:地下党员们用简单的密码语言来传递重复出现的情报。在《潜伏》中,地下党员们经常需要传递一些重复出现的情报内容,如“紧急行动”“安全撤离”等。为了方便传递和解释,他们设计了一种简单的密码语言,或者手势来表示这些重复出现的问题。

  • 对执行效率要求不高:情报传递的频率和量都不大,不需要快速执行。在《潜伏》中,地下党员们传递情报的频率相对较低,且每次传递的情报量也不大。因此,他们可以花费一些时间来解释密码语言,而不需要追求极高的执行效率。

三、解释器模式示例

1、定义抽象表达式接口(Abstract Expression)

public interface Expression {String interpret(Context context);
}

 2. 定义上下文类(Context)

public class Context {private Map<String, String> variables = new HashMap<>();public void setVariable(String key, String value) {variables.put(key, value);}public String getVariable(String key) {return variables.getOrDefault(key, "");}
}

3. 实现具体表达式类(Concrete Expression)

终结符表达式(Terminal Expressions)是解析过程中的基本单元,直接返回它们的值,不需要进一步解析。

非终结符表达式(Non-Terminal Expressions)是由多个终结符表达式或非终结符表达式组合而成的复杂表达式,通过递归调用其他表达式的interpret方法来解析整个表达式。

public class CodeExpression implements Expression {private String code;public CodeExpression(String code) {this.code = code;}@Overridepublic String interpret(Context context) {return context.getVariable(code);}
}public class MessageExpression implements Expression {private String message;public MessageExpression(String message) {this.message = message;}@Overridepublic String interpret(Context context) {return message;}
}public class CompositeExpression implements Expression {private List<Expression> expressions = new ArrayList<>();public void add(Expression expression) {expressions.add(expression);}@Overridepublic String interpret(Context context) {StringBuilder result = new StringBuilder();for (Expression expression : expressions) {result.append(expression.interpret(context));}return result.toString();}
}

4、场景

public class Main {public static void main(String[] args) {// 创建上下文Context context = new Context();context.setVariable("A", "行动");context.setVariable("B", "停止");context.setVariable("C", "撤退");// 构建表达式CompositeExpression compositeExpression = new CompositeExpression();compositeExpression.add(new CodeExpression("A"));compositeExpression.add(new MessageExpression(","));compositeExpression.add(new CodeExpression("B"));compositeExpression.add(new MessageExpression(","));compositeExpression.add(new CodeExpression("C"));// 解释表达式String result = compositeExpression.interpret(context);System.out.println("解析结果: " + result);}
}//输出
解析结果: 行动,停止,撤退

http://www.ppmy.cn/devtools/155597.html

相关文章

使用jmeter进行压力测试

使用jmeter进行压力测试 jmeter安装 官网安装包下载&#xff0c;选择二进制文件&#xff0c;解压 tar -xzvf apache-jmeter-x.tgz依赖jdk安装 yum install java-1.8.0-openjdk环境变量配置&#xff0c;修改/etc/profile文件&#xff0c;添加以下内容 export JMETER/opt/apa…

C++ 堆栈分配的区别

这两种声明方式有什么区别 1.使用 new 关键字动态分配内存 动态分配&#xff1a;使用 new 关键字会在堆&#xff08;heap&#xff09;上分配内存&#xff0c;并返回一个指向该内存位置的指针。生命周期&#xff1a;对象的生命周期不会随着声明它的作用域结束而结束&#xff0…

SQL进阶实战技巧:如何分析浏览到下单各步骤转化率及流失用户数?

目录 0 问题描述 1 数据准备 2 问题分析 3 问题拓展 3.1 跳出率计算

gitee——报错修改本地密码

有时候当我们向远端push本地的仓库时会有一些报错的行为。 如下&#xff1a; 这是因为我们在gitee修改了密码时&#xff0c;本地还没有更新提交&#xff0c;总是报错 解决修改密码报错 如下&#xff1a; 1.在本地点击搜索栏找到控制面板 步骤如下

一文读懂 HTTP:Web 数据交换的基石

HTTP 概述 HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础&#xff0c;同时&#xff0c;也是一种客户端—服务器&#xff08;client-server&#xff09;协议&#xff0c;也就是说&#xff0c;请求是由接受方——通常是 Web 浏览器——发…

移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响

一、碎片化时间利用增加 随着生活节奏的加快&#xff0c;移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙&#xff0c;用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求&#xff0c;无需下载安装&#xff0c;随时可用&…

mac连接linux服务器

1、mac连接linux服务器 # ssh -p 22 root192.168.1.152、mac指定密码连接linux服务器 (1) 先安装sshpass,下载后解压执行 ./configure && make && makeinstall https://sourceforge.net/projects/sshpass/ (2) 连接linux # sshpass -p \/\\\[\!\\wen12\$ s…

17.2 图形绘制8

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 17.2.10 重绘 先看以下例子&#xff1a; 【例 17.28】【项目&#xff1a;code17-028】绘制填充矩形。 private void button1_Clic…