如何通过策略模式与函数式接口消除重复代码以遵循 DRY 原则

星墨小哥_1632

星墨小哥_1632

2026-08-24

329人浏览

原创

如何通过策略模式与函数式接口消除重复代码以遵循 DRY 原则

本文讲解如何用 Java 的 Predicate 接口重构重复的 token 匹配逻辑,将条件判断抽象为可复用的高阶 match 方法,在保持可读性的同时真正践行 DRY(Don’t Repeat Yourself)原则。

本文讲解如何用 java 的 `predicate` 接口重构重复的 token 匹配逻辑,将条件判断抽象为可复用的高阶 `match` 方法,在保持可读性的同时真正践行 dry(don’t repeat yourself)原则。

在解析器或词法分析器开发中,频繁出现类似 match(ITokenType, int)match(Class>, int) 这类语义高度一致、仅判断逻辑不同的方法——它们都执行三步操作:检查是否有有效 token → 获取目标 token → 根据特定条件判断是否匹配 → 成功则返回,否则返回 null。这种结构重复正是 DRY 原则被违反的典型信号。

直接合并为一个重载方法看似简单,但因判断逻辑本质不同(类型等值 vs 类型实例检查),硬编码会导致分支膨胀或类型擦除问题。更优雅的解法是将“判断逻辑”参数化:引入一个通用的 match(Predicate<token>, int)</token> 作为核心实现,再让两个原有方法作为语义清晰的门面(Facade),各自传入对应的 lambda 表达式:

public Token match(ITokenType expectedToken, int tokenNum) {
    return match(t -> expectedToken == t.get_type(), tokenNum);
}

public Token match(Class> clazz, int tokenNum) {
    return match(t -> clazz.isInstance(t.get_type()), tokenNum);
}

public Token match(Predicate<token> predicate, int tokenNum) {
    if (hasToken(_currentTokenNum)) {
        Token t = getToken(tokenNum);
        if (predicate.test(t)) {
            return t;
        }
    }
    return null;
}</token>

优势说明

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • 零重复逻辑:空校验、token 获取、返回路径全部收敛至单一方法;
  • 开闭友好:新增匹配策略(如正则匹配、复合条件)只需新增一个门面方法,无需改动核心流程;
  • 类型安全Predicate<token></token> 明确约束输入类型,避免 Object 强转风险;
  • 延迟求值predicate.test(t)getToken() 之后执行,确保 t 非空且已就绪,符合原始语义。

⚠️ 注意事项

  • 不应为减少两处重复而牺牲可维护性。若两个方法长期共存、变更频率极低,且团队对 lambda 熟悉度不高,保留原貌亦是合理选择;
  • Predicate 的语义应聚焦于 token 本身的类型判断,避免在 lambda 中嵌入副作用(如日志、状态修改),否则会破坏纯函数特性,降低可测试性;
  • 若未来 match 内部逻辑扩展(如增加跳过空白、回溯支持),统一维护点的价值将显著提升——此时重构的 ROI(投资回报率)远高于初期成本。

总结而言,DRY 不是教条式的“消除所有重复”,而是识别有意义的抽象边界,并将变化点隔离为可配置行为。本例中,Predicate 正是那个恰到好处的抽象,它让代码既简洁又富有弹性,真正实现了“一次编写,多处受控复用”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8697

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5902

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5312

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

964

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1136

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2289

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19651

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1055

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习