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

行为型设计模式之Interpreter(解释器)

行为型设计模式之Interpreter(解释器)

前言:
自己的话理解:自定义一个解释器用来校验参数或数据是否合法。

1)意图

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

2)结构

在这里插入图片描述

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;/*** @author psd 行为设计模式之解释器模式*/
public class InterpreterPattern {public static void main(String[] args) {Context context = new Context();context.check("江苏的南京");context.check("南京的一哥");context.check("南京的芜湖");context.check("安徽的合肥");System.out.println("------------");context.check("合肥的马鞍山");}
}/*** 表达式接口*/
interface Expression {/*** 解释器 判断是否合法* * @param context*            文本信息* @return 是否合法*/boolean interpret(String context);
}class Context{private String[] prefixArr = {"江苏","安徽","南京"};private String[] suffixArr = {"南京","苏州","合肥","马鞍山","芜湖", "|州","一哥","马鞍山"};private NonterminalExpression nonterminalExpression;public Context() {TerminalExpression presix = new TerminalExpression(prefixArr);TerminalExpression suffix = new TerminalExpression(suffixArr);nonterminalExpression = new NonterminalExpression(presix,  suffix);}public void check(String info) {boolean result = nonterminalExpression.interpret(info);if (result) {System.out.println("识别成功.....");} else {System.out.println("识别失败.....");}}
}/*** 非终端表达式*/
class NonterminalExpression implements Expression {private TerminalExpression presix;private TerminalExpression suffix;public NonterminalExpression(TerminalExpression presix, TerminalExpression suffix) {this.presix = presix;this.suffix = suffix;}@Overridepublic boolean interpret(String context) {String[] splitStr = context.split("的");// 判断前缀和后缀是否合法return presix.interpret(splitStr[0]) && suffix.interpret(splitStr[1]);}
}/*** 终端表达式*/
class TerminalExpression implements Expression {private Set<String> set = new HashSet<>();public TerminalExpression(String[] data) {Collections.addAll(set, data);}/*** 判断是否合法* * @param context*            文本信息* @return 是否合法*/@Overridepublic boolean interpret(String context) {return set.contains(context);}
}

3)适用性

Interpreter模式适用于当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽
象语法树时,以下情况效果最好:

  • 该文法简单。对于复杂的发文,文法的类层次变得庞大而无法管理。
  • 效率不是一个关键问题。最高效的解释器通常不是通过直接解释语法分析树实现的,
    而是首先将它们转换成另一种形式。

总结:何时选择解释器模式
场景特征 例子
需解析领域特定语言(DSL) 金融公式、业务规则表达式
频繁处理结构化查询/过滤条件 自定义日志过滤器、数据查询
简单语法且变化不频繁 数学表达式、布尔逻辑解析
动态执行用户定义的规则 游戏AI条件、促销活动规则引擎

喜欢我的文章记得点个在看,或者点赞,持续更新中ing…

http://www.xdnf.cn/news/12657.html

相关文章:

  • 低功耗MQTT物联网架构Java实现揭秘
  • 八、【ESP32开发全栈指南:UDP客户端】
  • NLP学习路线图(三十):微调策略
  • Python图论与网络可视化——网络结构、路径分析与生物代谢通路
  • 【Linux shell】shell中的变量——构建脚本逻辑的基石
  • 水利工程流速监测中的雷达流速仪
  • FreeRTOS事件组-笔记
  • 33、原子操作
  • C++常用的自动化测试库
  • PostgreSQL数据类型使用
  • 【生活】程序员防猝si指南
  • java_网络服务相关_gateway_nacos_feign区别联系
  • JAVA-springboot log日志
  • 打卡46天
  • DDPM优化目标公式推导
  • JAVA国际版二手交易系统手机回收好物回收发布闲置商品系统源码支持APP+H5
  • 每日算法刷题Day25 6.7:leetcode二分答案3道题,用时1h40min(遇到两道动态规划和贪心时间较长)
  • 【Go语言基础【15】】数组:固定长度的连续存储结构
  • FreeRTOS任务之深入篇
  • ps蒙版介绍
  • Mac软件卸载指南,简单易懂!
  • MySQL复杂SQL(多表联查/子查询)详细讲解
  • 程序代码篇---Python串口
  • Vibe Coding AI编程
  • 安全访问家中 Linux 服务器的远程方案 —— 专为单用户场景设计
  • nginx日志的一点理解
  • Nginx 事件驱动理解
  • LeetCode 118 杨辉三角 (Java)
  • 移动应用开发专业核心课程以及就业方向
  • QT使用AES加解密,openssl及QCA问题记录