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

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

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


1. 工厂模式(Factory Pattern)

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

// 产品接口
interface DatabaseConnection {
    void connect();
}

// 具体产品实现
class MySQLConnection implements DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("Connected to MySQL");
    }
}

class PostgreSQLConnection implements DatabaseConnection {
    @Override
    public 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存储创建逻辑,避免冗长的条件判断和工厂类。

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)

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

interface Handler {
    void handleRequest(String request);
    void setNext(Handler next);
}

abstract class AbstractHandler implements Handler {
    private Handler next;

    @Override
    public void setNext(Handler next) {
        this.next = next;
    }

    protected void passToNext(String request) {
        if (next != null) {
            next.handleRequest(request);
        }
    }
}

// 具体处理器
class AuthenticationHandler extends AbstractHandler {
    @Override
    public void handleRequest(String request) {
        if (request.contains("Auth")) {
            System.out.println("Authenticated");
        } else {
            passToNext(request);
        }
    }
}

class LoggingHandler extends AbstractHandler {
    @Override
    public void handleRequest(String request) {
        System.out.println("Logging request: " + request);
        passToNext(request);
    }
}

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

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

相关文章:

  • JVM - 类加载相关
  • 做一个多级动态表单,可以保存数据和回显数据
  • 【论文分析】无人机轨迹规划,Fast-Planner:实时避障+全局最优的路径引导优化算法
  • Rust从入门到精通之进阶篇:12.高级类型系统
  • ubuntu虚拟机的磁盘扩容,虚拟机的克隆
  • 将ZABBIX结合AI实现自动化运维
  • <数据集>轨道异物识别数据集<目标检测>
  • 操作系统高频(四)linux基础
  • nginx-rtmp-module之ngx_rtmp_live_module.c代码详解
  • 前端显示no data(没有数据,一片空白)
  • ComfyUi教程之阿里的万象2.1视频模型
  • OGG故障指南:OGG-00446 Checkpoint table does not exist
  • 深度解析Spring Boot可执行JAR的构建与启动机制
  • Go 语言规范学习(2)
  • 【商城实战(74)】数据采集与整理,夯实电商运营基石
  • C++:类和对象(二)
  • 如何快速解决django报错:cx_Oracle.DatabaseError: ORA-00942: table or view does not exist
  • 智能运维时代的网络拓扑管理:乐维监控的架构可视化实践
  • 科技快讯 | 谷歌发布新一代推理模型;我国成功发射天链二号04星;Manus:将举行线下活动 正努力让更多人用上Manus
  • 基于javaweb的SpringBoot房屋出租系统设计与实现(源码+文档+部署讲解)
  • 把网站做静态化/抖音推广合作方式
  • 腾讯云服务器多少钱一个月/山西seo排名
  • 泉州网站公司/网络广告营销案例有哪些
  • 景观设计公司排名前十强/昆明优化网站公司
  • 做网站知识大全/哈尔滨网络seo公司
  • 企业网站例子/宁波关键词排名优化