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

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 结语

解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义语言的文法规则,并提供解释器来解释符合规则的语句。解释器模式通过定义语言的文法表示,使得可以解释执行特定语言的语句。在本文中,我们将深入研究Java中解释器模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

解释器模式是一种行为型设计模式,用于定义语言的文法规则,并提供解释器来解释符合规则的语句。解释器模式的核心思想是将语言的文法表示为一个解释器,并通过解释器来解释执行语句。解释器模式通常包含两个主要角色:抽象表达式(Abstract Expression)和具体表达式(Concrete Expression)。

  • 抽象表达式(Abstract Expression): 声明一个抽象的解释操作,由具体表达式来实现
  • 具体表达式(Concrete Expression): 实现抽象表达式的解释操作,并对语句进行解释执行

2. 应用场景

解释器模式通常在以下场景中使用:

  • 需要定义一种语言的文法规则:

    当需要定义一种语言的文法规则,以支持对语句进行解释时,可以使用解释器模式

  • 语言的文法规则相对简单:

    当语言的文法规则相对简单,可以通过有限数量的表达式来表示时,可以使用解释器模式

  • 语言的语句经常变化:

    当语言的语句经常变化,需要灵活支持新的语句时,可以使用解释器模式

3. 代码实现

下面通过一个简单的例子来演示解释器模式的实现。假设有一个简单的规则引擎,我们可以使用解释器模式来解释执行规则。

抽象表达式 - 规则表达式 RuleExpression

package com.cheney.demo;interface RuleExpression {boolean interpret(String context);
}

具体表达式 - 等于表达式 EqualsExpression

package com.cheney.demo;class EqualsExpression implements RuleExpression {private String value;public EqualsExpression(String value) {this.value = value;}@Overridepublic boolean interpret(String context) {return context.equals(value);}
}

具体表达式 - 或表达式 OrExpression

package com.cheney.demo;class OrExpression implements RuleExpression {private RuleExpression expression1;private RuleExpression expression2;public OrExpression(RuleExpression expression1, RuleExpression expression2) {this.expression1 = expression1;this.expression2 = expression2;}@Overridepublic boolean interpret(String context) {return expression1.interpret(context) || expression2.interpret(context);}
}

客户端启动器 Main

package com.cheney.demo;public class Main {public static void main(String[] args) {// 使用解释器模式实现规则引擎RuleExpression re1 = new EqualsExpression("A");RuleExpression re2 = new EqualsExpression("B");RuleExpression re3 = new EqualsExpression("C");// 构建规则:A 或 (B 和 C)RuleExpression rule = new OrExpression(re1, new AndExpression(re2, re3));// 测试规则// trueSystem.out.println("规则 A: " + rule.interpret("A"));// falseSystem.out.println("规则 B: " + rule.interpret("B"));// falseSystem.out.println("规则 C: " + rule.interpret("C"));// trueSystem.out.println("规则 A, B, C: " + rule.interpret("A, B, C"));}
}

在上述例子中,RuleExpression 是抽象表达式接口,声明了一个解释操作。EqualsExpression 是具体表达式,实现了抽象表达式的解释操作,并对语句进行解释执行。OrExpression 是一个复合表达式,实现了抽象表达式的解释操作,并将解释操作委托给具体的子表达式。在客户端中,我们使用解释器模式实现了一个简单的规则引擎,通过构建不同的表达式组合,可以实现灵活的规则解释。

结语

解释器模式是一种用于定义语言的文法规则,并提供解释器来解释执行语句的设计模式。通过使用解释器模式,可以实现灵活的语法解释,使得系统可以动态地支持不同的语句。在实际开发中,解释器模式常被用于实现脚本语言的解释器、规则引擎等场景。通过合理使用解释器模式,可以提高系统的可扩展性和可维护性。


【Java 设计模式】系列 《23 种设计模式》 与 《7 大设计原则》 总纲
🚩设计原则
✨单一职责原则(SRP) 规定一个类应该只有一个引起变化的原因
✨开放/封闭原则(OCP) 表明软件实体应该是可以扩展的,但是不可修改的
✨里氏替换原则(LSP) 强调派生类必须能够替代其基类而不引起程序错误
✨依赖倒置原则(DIP) 倡导高层模块不应该依赖于低层模块,二者都应该依赖于抽象
✨接口隔离原则(ISP) 提倡一个类不应该被强迫依赖它不使用的接口
✨合成/聚合复用原则(CARP) 建议尽量使用合成/聚合,尽量不要使用继承
✨迪米特法则(LoD) 规定一个对象应该对其他对象有最少的了解

🚀创建型设计模式
✨单例模式 保证一个类仅有一个实例,并提供一个访问它的全局点
✨工厂方法模式 定义一个用于创建对象的接口,但是由子类决定实例化哪一个类
✨抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
✨建造者模式 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
✨原型模式 通过复制现有的对象来创建新对象,而不是从头开始创建

🚀结构型设计模式
✨适配器模式 将一个类的接口转换成客户希望的另外一个接口
✨桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化
✨组合模式 将对象以树形结构组合以表示“部分-整体”的层次结构
✨装饰器模式 动态地给一个对象添加一些额外的职责
✨外观模式 为子系统中的一组接口提供一个一致的界面
✨代理模式 为其他对象提供一种代理以控制对这个对象的访问
✨享元模式 用共享的方式高效地支持大量小粒度对象

🚀行为型设计模式
✨观察者模式 定义对象间的一对多依赖,当一个对象改变状态,所有依赖者都会受到通知并自动更新
✨策略模式 定义一系列算法,将它们封装起来,并且使它们可以相互替换
✨命令模式 将请求封装成对象,使得可以用不同的请求对客户进行参数化
✨状态模式 允许对象在其内部状态改变时改变它的行为
✨责任链模式 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求
✨访问者模式 将算法与对象结构分离,并且可以在不改变对象结构的前提下定义新的操作
✨中介者模式 用一个中介对象来封装一系列的对象交互
✨备忘录模式 在不破坏封装的情况下,捕获对象的内部状态,并在对象之外保存这个状态
✨迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示
✨模版方法模式 定义一个操作中的算法的骨架,将一些步骤延迟到子类中
✨解释器模式 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Web】小白也能做的RWCTF体验赛baby题部分wp

遇到不会的题,怎么办!有的师傅告诉你完了,废了,寄了!只有Z3告诉你,稳辣!稳辣!都稳辣! 这种CVE复现的题型,不可能要求选手从0到1进行0day挖掘,其实…

Go语言安装及开发环境配置

目录 官网 国内 Linux(CentOS & Ubuntu)安装 环境变量设置 命令行下开发 开发模式执行 编译 IDE下开发 插件安装 安装依赖工具 运行 常见问题 1、dial tcp 172.217.160.113:443: i/o timeout 2、VS Code不能完美显示zsh问题 官网 访问Golang官网的下载链接&a…

【JS基础】事件对象event、环境对象this、事件的高级操作

文章目录 一、事件对象1.1 事件对象是什么?1.2 使用方法 二、环境对象this以及回调函数2.1 它是什么?2.2 演示示例 三、事件的高级操作3.1 事件流3.2 事件捕获3.3 事件冒泡以及阻止冒泡3.4 事件解绑3.5 mouseover和mouseenter事件的区别3.6 事件委托它是…

C#学习笔记_结构体

结构体(struct)是一种值类型,通常用于封装一些小型变量数据。在C#面向对象编程学习时,可以将结构体暂时理解成一种简单的对象。 结构体语法 一、声明结构体 声明结构体语法如下: public struct 结构体 {public 数据类型 变量名;public 数…

树莓派基础应用:智能家居监控系统

引言: 随着智能家居的普及,家居安全与监控逐渐成为人们关注的焦点。树莓派作为一种功能强大的迷你计算机,为我们提供了实现智能家居监控系统的可能。在本篇博客中,我们将通过构建一个简单的智能家居监控系统,来探索树莓…

Vue<圆形旋转菜单栏效果>

效果图: 大家不一定非要制成菜单栏,可以看下人家的华丽效果😝,参考地址 https://travelshift.com/ 大佬写的效果可比我的强多了,但是无从下手,所以就自己琢磨怎么写了,只能说效果勉强差不多 可…

thinkadmin列表页工单状态多色显示,操作按钮条件判断

{field: gdtz, title: 工单状态, align: left, minWidth: 140,templet: function (d){if (d.gdtz==1){return "<span class=layui-badge layui-bg-cyan>" + 报装已提交 + "</span>" ;}else if (d.gdtz==2){return "

【开发用苹果电脑选择】MacBook下半部——无头骑士

开发用苹果电脑&#xff0c;16G是最低要求&#xff0c;IDEA开两个窗口内存基本满了&#xff0c;32G的苹果电脑都要2万 下面是我收集的2万苹果电脑的替代品 关键词&#xff1a;MacBook下半部下半套无头骑士 32G内存2T硬盘4300元&#xff0c;优点&#xff1a;白苹果、价格便宜

FPGA HDMI IP之DDC(本质I2C协议)通道学习

目的&#xff1a; 使用KingstVIS逻辑分析仪软件分析HDMI的DDC通道传输的SCDC数据&#xff08;遵循I2C协议&#xff09;&#xff0c;同时学习了解SCDC的寄存器与I2C通信协议。 部分英文缩写&#xff1a; HDMIHigh Definition Multi-media Interface高清多媒体接口DDCDisplay Dat…

一文讲述SASS简介和使用方法

一、什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一个扩展开发工具&#xff0c;它允许你使用变量、条件语句等&#xff0c;使开发更简单可维护。这里是官方文档。 二、基本语法 1&#xff09;变量 sass的变量名必须是一个$符号开头&#xff0c;后面紧跟变量名…

优雅的管理你的docker容器【Docker Swarm篇】

如果docker容器较多时&#xff0c;可以使用docker-compose管理自己的容器组&#xff0c;但是随着容器增多&#xff0c;docker-compose也会变的复杂起来&#xff0c;如果使用k8s&#xff0c;又会比较重&#xff0c;因为k8s集群的最小运行内存为2GB&#xff0c;所以在这中间&…

【Spring Boot 3】【@Scheduled】动态新增定时任务

【Spring Boot 3】【@Scheduled】动态新增定时任务 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技…

深度学习 | 基于 CPU 的 tensorflow + keras + python 版本对照及环境安装

Hi&#xff0c;大家好&#xff0c;我是源于花海。要让一个基于 CPU 的 tensorflow 和 keras 开发的深度学习模型正确运行起来&#xff0c;配置环境是个重要的问题&#xff0c;本文介绍了 tensorflow 和 keras 和对应的 python 版本以及安装环境的部分流程。 目录 一、tensorfl…

Redis核心技术与实战【学习笔记】 - 3.Redis服务高可靠

1.数据同步&#xff1a;主从库如何实现数据一致&#xff1f; 前面我们学习了 AOF 和 RDB&#xff0c;如果 Redis 发生了宕机&#xff0c;它们可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据&#xff0c;从而保证尽量较少丢失数据&#xff0c;提升可靠性。 不过&…

B.修改数列

给定一个长度为 n 的正整数数列 a1,a2,…,an。 你可以对其中任意个&#xff08;可以是 0 个&#xff09;元素进行修改。 但是&#xff0c;每个元素最多只能修改一次&#xff0c;每次修改&#xff1a;要么令其加 1&#xff0c;要么令其减 1。 请问&#xff0c;至少需要修改多少个…

RTP工具改进(五)--使用qt

前篇 第四篇 RTP工具改进(四) - rtmp协议推送 前面使用的工具一直为mfc&#xff0c;今天将使用qt 来做界面&#xff0c;使用qt 来进行程序和协议的编写&#xff0c;qt部分目前还不包括rtp ps流和rtmp&#xff0c;暂时只有rtp 直接传输&#xff0c;关于rtmp协议和ps流协议&…

ubuntu和树莓派下vim插件管理

目录 管理方式选择vim手动方式管理插件延迟加载加载插件帮助文档 make管理vim插件1.安装make和git2.获取vim配置仓库3.准备工作4.安装相关软件5.安装并升级vim插件6.安装vim配置相关文件7.vim恢复到初始状态 管理方式选择 插件管理器vim-plug,Vundle等都依靠github,在国内由于…

在 VUE 项目中,使用 Axios 请求数据时,提示跨域,该怎么解决?

在 VUE 项目开发时&#xff0c;遇到个问题&#xff0c;正常设置使用 Axios 库请求数据时&#xff0c;报错提示跨域问题。 那在生产坏境下&#xff0c;该去怎么解决呢&#xff1f; 其可以通过以下几种方式去尝试解决&#xff1a; 1、设置允许跨域请求的响应头 1.1 在响应头中…

STM32实现软件IIC协议操作OLED显示屏(2)

时间记录&#xff1a;2024/1/27 一、OLED相关介绍 &#xff08;1&#xff09;显示分辨率128*64点阵 &#xff08;2&#xff09;IIC作为从机的地址0x78 &#xff08;3&#xff09;操作步骤&#xff1a;主机先发送IIC起始信号S&#xff0c;然后发送OLED的地址0x78&#xff0c;然…

机器学习的数据库积累........

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md ​​​​​​​ 另一个database:&#xff08;网址:Object Detection Made Easy with TensorFlow Hub: Tutorial&#xff09; Object Detection Made Easy with Ten…