当前位置: 首页 > news >正文

【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) 规定一个对象应该对其他对象有最少的了解

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

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

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

相关文章:

  • DAY35:贪心算法part4、860\406\452
  • 【Docker】docker安装jenkins
  • python数据生成excel文件实现
  • uniapp中mescroll的使用
  • 医院如何筛选安全合规的内外网文件交换系统?
  • uniapp如何添加多个表单数组?
  • iPhone 14支持NFC吗?如果支持,那么怎么启用
  • 华为radius认证
  • Qt 信号与槽
  • 时序数据库 Tdengine 执行命令能够查看执行的sql语句
  • Matlab plot绘图的 title 语法
  • 前端怎么监听手机键盘是否弹起
  • QGIS编译(跨平台编译)之二十七:giflib编译(Windows、Linux、MacOS环境下编译)
  • 高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)
  • 视觉检测系统:工厂生产零部件的智能检测
  • CSS中外联样式表代表的含义
  • Github访问慢解决办法
  • JavaScript设计模式与开发实践系列之策略模式
  • Joomla 2.x, 3.x useful code cheatsheet
  • Python十分钟制作属于你自己的个性logo
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • springboot_database项目介绍
  • Yii源码解读-服务定位器(Service Locator)
  • 编写高质量JavaScript代码之并发
  • 大数据与云计算学习:数据分析(二)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于Android乐音识别(2)
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 深入浏览器事件循环的本质
  • 手写双向链表LinkedList的几个常用功能
  • 优秀架构师必须掌握的架构思维
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​TypeScript都不会用,也敢说会前端?
  • !!Dom4j 学习笔记
  • #Ubuntu(修改root信息)
  • (10)STL算法之搜索(二) 二分查找
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (安卓)跳转应用市场APP详情页的方式
  • (二)springcloud实战之config配置中心
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (排序详解之 堆排序)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)iOS字体
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 流——流的类型体系简单介绍
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • @ComponentScan比较
  • []FET-430SIM508 研究日志 11.3.31
  • [20160902]rm -rf的惨案.txt
  • [20171101]rman to destination.txt
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试