
设计模式实战对比单例、适配器、责任链3模式在Java中的实现与选择在软件开发中设计模式是解决常见问题的经典方案。它们不仅能提升代码的可维护性和可扩展性还能帮助开发者更高效地沟通设计意图。本文将深入探讨单例模式、适配器模式和责任链模式在Java中的实现方式并通过同一业务场景审批流程展示不同模式的应用差异。1. 设计模式基础与核心价值设计模式起源于建筑学家Christopher Alexander的工作后被软件工程领域引入。它们不是具体的代码实现而是对优秀设计经验的抽象总结。理解设计模式的核心价值在于代码复用避免重复解决相同问题设计标准化提供通用的设计词汇表解耦降低系统各部分间的依赖可维护性使代码更易于理解和修改在Java生态中设计模式被广泛应用。Spring框架就大量使用了单例、工厂、代理等模式。理解这些模式能帮助我们更好地使用主流框架。2. 单例模式确保全局唯一性单例模式确保一个类只有一个实例并提供一个全局访问点。这在需要控制资源访问如数据库连接池或配置管理时特别有用。2.1 饿汉式实现public class EagerSingleton { private static final EagerSingleton instance new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } }特点类加载时就初始化线程安全可能造成资源浪费如果实例未被使用实现简单适合轻量级对象2.2 懒汉式实现public class LazySingleton { private static volatile LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { if (instance null) { synchronized (LazySingleton.class) { if (instance null) { instance new LazySingleton(); } } } return instance; } }特点延迟初始化节省资源双重检查锁定保证线程安全实现较复杂适合重量级对象提示在Java中枚举单例是最安全的实现方式能防止反射攻击和序列化问题。2.3 审批流程中的单例应用在审批系统中审批配置管理器适合使用单例模式public class ApprovalConfigManager { private static ApprovalConfigManager instance; private MapString, ApprovalRule rules; private ApprovalConfigManager() { loadRules(); } public static synchronized ApprovalConfigManager getInstance() { if (instance null) { instance new ApprovalConfigManager(); } return instance; } private void loadRules() { // 从数据库或配置文件加载审批规则 rules new HashMap(); rules.put(leave, new ApprovalRule(3, 部门经理)); // 更多规则... } public ApprovalRule getRule(String type) { return rules.get(type); } }3. 适配器模式接口转换的艺术适配器模式充当两个不兼容接口之间的桥梁。它允许原本因接口不匹配而无法一起工作的类能够协同工作。3.1 类适配器实现// 目标接口 public interface ApprovalService { void submit(ApprovalRequest request); } // 需要适配的类 public class LegacyApprovalSystem { public void processRequest(MapString, String params) { // 旧系统的处理逻辑 } } // 适配器 public class ApprovalAdapter extends LegacyApprovalSystem implements ApprovalService { Override public void submit(ApprovalRequest request) { MapString, String params convertRequest(request); super.processRequest(params); } private MapString, String convertRequest(ApprovalRequest request) { // 转换逻辑 return new HashMap(); } }3.2 对象适配器实现public class ApprovalObjectAdapter implements ApprovalService { private LegacyApprovalSystem legacySystem; public ApprovalObjectAdapter(LegacyApprovalSystem legacySystem) { this.legacySystem legacySystem; } Override public void submit(ApprovalRequest request) { MapString, String params convertRequest(request); legacySystem.processRequest(params); } private MapString, String convertRequest(ApprovalRequest request) { // 转换逻辑 return new HashMap(); } }两种实现对比特性类适配器对象适配器实现方式继承组合灵活性较低单继承限制较高代码量较少较多与适配者的耦合度高低覆盖适配者方法的能力强可直接重写弱需要通过委托3.3 审批流程中的适配器应用当新系统需要集成第三方审批服务时// 第三方服务接口 public interface ThirdPartyApproval { String sendApproval(String jsonRequest); } // 适配器实现 public class ThirdPartyApprovalAdapter implements ApprovalService { private ThirdPartyApproval thirdPartyService; public ThirdPartyApprovalAdapter(ThirdPartyApproval service) { this.thirdPartyService service; } Override public void submit(ApprovalRequest request) { String json convertToJson(request); String response thirdPartyService.sendApproval(json); processResponse(response); } private String convertToJson(ApprovalRequest request) { // 转换逻辑 return ; } private void processResponse(String response) { // 处理响应 } }4. 责任链模式动态处理流程责任链模式将请求的发送者和接收者解耦使多个对象都有机会处理请求。这些对象形成一条链请求沿着链传递直到被处理。4.1 基础实现public abstract class Approver { protected Approver next; public void setNext(Approver next) { this.next next; } public abstract void processRequest(ApprovalRequest request); } public class Manager extends Approver { Override public void processRequest(ApprovalRequest request) { if (request.getDays() 3) { System.out.println(经理审批通过); } else if (next ! null) { next.processRequest(request); } } } public class Director extends Approver { Override public void processRequest(ApprovalRequest request) { if (request.getDays() 7) { System.out.println(总监审批通过); } else if (next ! null) { next.processRequest(request); } } } public class VP extends Approver { Override public void processRequest(ApprovalRequest request) { if (request.getDays() 15) { System.out.println(副总裁审批通过); } else { System.out.println(审批拒绝); } } }4.2 使用示例Approver manager new Manager(); Approver director new Director(); Approver vp new VP(); manager.setNext(director); director.setNext(vp); ApprovalRequest request new ApprovalRequest(5, 病假); manager.processRequest(request); // 将由总监审批4.3 高级特性实现动态调整责任链public class DynamicApprovalChain { private ListApprover approvers new ArrayList(); public void addApprover(Approver approver) { approvers.add(approver); if (approvers.size() 1) { approvers.get(approvers.size()-2).setNext(approver); } } public void process(ApprovalRequest request) { if (!approvers.isEmpty()) { approvers.get(0).processRequest(request); } } }审批规则配置化public class ConfigurableApprover extends Approver { private PredicateApprovalRequest canHandle; private ConsumerApprovalRequest handler; public ConfigurableApprover(PredicateApprovalRequest canHandle, ConsumerApprovalRequest handler) { this.canHandle canHandle; this.handler handler; } Override public void processRequest(ApprovalRequest request) { if (canHandle.test(request)) { handler.accept(request); } else if (next ! null) { next.processRequest(request); } } }5. 模式对比与选型指南三种模式在审批系统中的表现对比维度单例模式适配器模式责任链模式主要目的控制实例数量接口转换请求处理链适用场景全局配置、资源管理系统集成、接口兼容多级审批、过滤器链灵活性低中高复杂度低中高扩展性差好非常好典型应用配置管理、日志系统第三方服务集成、遗留系统适配审批流程、异常处理链线程安全性考虑需要特别注意通常不需要通常不需要测试难度较高全局状态中等较低性能影响通常正面减少对象创建轻微负面额外调用层取决于链长度与其它模式结合使用常与工厂模式结合常与外观模式结合常与命令模式结合选型决策流程识别核心需求如果需要严格控制资源访问 → 考虑单例如果需要对接不兼容接口 → 考虑适配器如果需要动态处理流程 → 考虑责任链评估扩展需求未来是否会有更多处理节点责任链更合适是否会增加新的数据源或服务适配器更合适考虑团队熟悉度单例最易理解和实现责任链需要更复杂的设计性能考量高频访问场景慎用同步单例长责任链可能影响性能组合使用示例public class ApprovalSystem { private static ApprovalSystem instance; private ApprovalService approvalService; private ApprovalSystem() { // 使用适配器整合第三方服务 ThirdPartyApproval thirdParty new ThirdPartyApprovalImpl(); this.approvalService new ThirdPartyApprovalAdapter(thirdParty); } public static synchronized ApprovalSystem getInstance() { if (instance null) { instance new ApprovalSystem(); } return instance; } public void process(ApprovalRequest request) { // 构建责任链 Approver chain createApprovalChain(); chain.processRequest(request); } private Approver createApprovalChain() { Approver manager new Manager(); Approver director new Director(); Approver vp new VP(); manager.setNext(director); director.setNext(vp); return manager; } }在实际项目中这三种模式常常组合使用。例如审批系统可能使用单例管理配置适配器整合多个审批服务责任链处理实际审批流程。理解每种模式的适用场景和限制才能做出最合适的设计决策。