Java 8 代码重构实战之四 Lambda表达式重构工厂模式与责任链模式

server/2025/3/31 21:52:11/

设计模式为解决常见软件问题提供了经典方案,但在现代编程语言中,部分模式可通过Lambda表达式进一步简化。本文以工厂模式责任链模式为例,探讨如何用Lambda表达式减少冗余代码,提升灵活性与可读性。


1. 工厂模式(Factory Pattern)

传统实现
工厂模式通过工厂类封装对象创建逻辑,客户端无需直接依赖具体类。通常需要定义接口、多个实现类和一个工厂类。

java">// 产品接口
interface DatabaseConnection {void connect();
}// 具体产品实现
class MySQLConnection implements DatabaseConnection {@Overridepublic void connect() {System.out.println("Connected to MySQL");}
}class PostgreSQLConnection implements DatabaseConnection {@Overridepublic void connect() {System.out.println("Connected to PostgreSQL");}
}// 工厂类
class ConnectionFactory {public DatabaseConnection createConnection(String type) {switch (type) {case "MySQL": return new MySQLConnection();case "PostgreSQL": return new PostgreSQLConnection();default: throw new IllegalArgumentException("Invalid type");}}
}

Lambda重构
利用Supplier函数式接口和Map存储创建逻辑,避免冗长的条件判断和工厂类。

java">import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;public class Main {private static final Map<String, Supplier<DatabaseConnection>> CONNECTION_FACTORY = new HashMap<>();static {CONNECTION_FACTORY.put("MySQL", MySQLConnection::new);CONNECTION_FACTORY.put("PostgreSQL", PostgreSQLConnection::new);}public static DatabaseConnection createConnection(String type) {Supplier<DatabaseConnection> supplier = CONNECTION_FACTORY.get(type);if (supplier == null) {throw new IllegalArgumentException("Invalid type");}return supplier.get();}public static void main(String[] args) {DatabaseConnection conn = createConnection("MySQL");conn.connect(); // 输出:Connected to MySQL}
}

优势

  • 消除工厂类:通过Map直接管理创建逻辑,扩展时只需添加新条目。
  • 动态注册:支持运行时动态添加或修改产品类型。
  • 代码简洁:避免switch-caseif-else分支判断。

2. 责任链模式(Chain of Responsibility Pattern)

传统实现
责任链模式将多个处理器对象链接成链,请求沿链传递直至被处理。需定义处理器接口和多个实现类。

java">interface Handler {void handleRequest(String request);void setNext(Handler next);
}abstract class AbstractHandler implements Handler {private Handler next;@Overridepublic void setNext(Handler next) {this.next = next;}protected void passToNext(String request) {if (next != null) {next.handleRequest(request);}}
}// 具体处理器
class AuthenticationHandler extends AbstractHandler {@Overridepublic void handleRequest(String request) {if (request.contains("Auth")) {System.out.println("Authenticated");} else {passToNext(request);}}
}class LoggingHandler extends AbstractHandler {@Overridepublic void handleRequest(String request) {System.out.println("Logging request: " + request);passToNext(request);}
}

Lambda重构
将处理逻辑封装为函数,通过函数组合构建责任链。

java">import java.util.function.UnaryOperator;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {// 定义处理函数UnaryOperator<String> authentication = request ->request.contains("Auth") ? "Authenticated" : request;UnaryOperator<String> logging = request -> {System.out.println("Logging: " + request);return request;};// 构建责任链UnaryOperator<String> chain = Stream.of(logging, authentication).reduce(UnaryOperator.identity(), UnaryOperator::andThen);// 处理请求String result = chain.apply("Request with Auth");System.out.println(result); // 输出:Authenticated}
}

优势

  • 零冗余类:处理逻辑直接由Lambda或方法引用实现。
  • 灵活组合:通过函数式组合(如andThen)动态构建链。
  • 代码轻量:避免复杂的类继承和链式调用管理。

总结

通过Lambda表达式重构传统设计模式,可显著降低代码复杂度:

  • 工厂模式
    Map存储Supplier函数,实现动态对象创建,消除工厂类。
  • 责任链模式
    将处理逻辑封装为函数,通过组合构建链,减少类层次结构。

适用场景

注意事项

  • 逻辑复杂度:若处理逻辑涉及状态管理或复杂流程,仍需传统实现。
  • 可读性:过度使用Lambda可能导致代码难以维护,需权衡简洁性与清晰性。

Lambda并非完全替代设计模式,而是提供了一种更轻量的实现选择。合理结合二者,可让代码既简洁又富有表现力。


http://www.ppmy.cn/server/180021.html

相关文章

HiveChat:提升团队协作效率的AI聊天应用

什么是 HiveChat &#xff1f; HiveChat 作为一款专为中小团队设计的 AI 聊天应用&#xff0c;支持 Deepseek、Open AI、Claude、Gemini 等模型。管理员一人配置&#xff0c;全团队轻松使用各种 AI 模型。凭借其强大的功能和便捷的操作&#xff0c;有望成为团队沟通协作的得力助…

模糊数学 | 模型 / 集合 / 关系 / 矩阵

注&#xff1a;本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常&#xff0c;请看原文。 模糊数学模型&#xff1a;隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…

​Android Gradle 插件(AGP)版本与 ​Gradle 版本需要严格对应

一、AGP 与 Gradle 版本对照表 Android Gradle 插件版本对应 Gradle 版本适用 Android Studio 版本​8.1.x8.2Arctic Fox (2020.3.1+)​8.0.x8.0Arctic Fox (2020.3.1+)​7.4.x7.5.1IntelliJ IDEA 2022+​7.3.x7.4IntelliJ IDEA 2022+​7.2.x7.3.3IntelliJ IDEA 2021.3+​7.1.x…

【LeetCode 热题 100】解答汇总

一、哈希表 1. 两数之和 | python【简单】 49. 字母异位词分组 | python【中等】 128. 最长连续序列 | python【中等】 二、双指针 283. 移动零 | python【简单】 盛最多水的容器 三数之和 接雨水 三、滑动窗口 3. 无重复字符的最长子串 | python 【中等】 49. 字母异…

如何选择适合的实验室铸铁地板和铸铁试验平板?北重专业帮助指南

选择适合的实验室铸铁地板和铸铁试验平板取决于实验室的具体需求和要求。以下是一些建议&#xff0c;希望对您有所帮助&#xff1a; 材质选择&#xff1a;铸铁通常是制作实验室地板和试验平板的首选材料&#xff0c;因为它具有高强度、耐磨性和稳定性。确保选择质量优良的铸铁材…

String类的模拟实现

我们在使用STL库的时候&#xff0c;不仅需要掌握如何使用&#xff0c;我们还需要了解一些底层的模拟实现。 1&#xff1a;需要模拟实现的string类函数 #pragma once #include<iostream> #include<assert.h> #include<utility> using namespace std;namespa…

Rust从入门到精通之进阶篇:12.高级类型系统

高级类型系统 Rust 的类型系统是其最强大的特性之一&#xff0c;它不仅提供了内存安全保证&#xff0c;还允许开发者创建灵活、可复用的代码。在本章中&#xff0c;我们将深入探索 Rust 的高级类型特性&#xff0c;包括泛型、特质&#xff08;trait&#xff09;和高级类型模式…

SpringBoot3+Vue3开发公司库房管理系统

系统介绍 管理公司库房的物品&#xff0c;物品出库、入库管理等。 功能介绍 系统分为2种角色&#xff0c;超级管理员、管理员。 超级管理员&#xff0c;含有系统全部功能&#xff0c;常用于对采购申请进行审批、对管理员进行管理。 管理员&#xff0c;包含人员管理、分类管…