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

java设计模式之迪米特法则使用场景分析

一、避免链式调用

场景描述:当代码中存在多层对象嵌套调用(如A.getB().getC().doSomething())时,调用者需了解多个对象的内部结构,导致耦合度升高。
解决方案:通过封装中间逻辑,将调用链拆分为独立方法,仅暴露必要接口。
案例:

  • 反例:customer.getOrder().getOrderItem().getProduct().getName()Customer类直接依赖OrderOrderItemProduct的实现。
  • 正例:在Customer类中添加getProductName()方法,内部封装链式调用逻辑,外部仅需调用customer.getProductName()

二、封装内部实现细节

场景描述:类的内部数据结构(如集合、复杂对象)若直接暴露给外部,可能被随意修改,破坏封装性。
解决方案:通过只读方法或不可变集合返回内部数据,限制外部直接操作。
案例:

  • 反例:ShoppingCart类直接返回List,外部可修改购物车商品列表。
  • 正例:返回Collections.unmodifiableList(products),并通过addProduct()removeProduct()方法控制操作。

三、中介者模式协调复杂交互

场景描述:多个对象间存在复杂依赖关系,直接交互导致代码冗余和耦合。
解决方案:引入中介者类统一管理交互逻辑,减少对象间的直接依赖。
案例:

  • 反例:AllInOneDevice类直接调用PrinterScanner的具体方法。
  • 正例:定义Device接口,由DeviceManager类协调所有设备操作,具体设备仅实现接口方法。

四、模块化设计与职责分离

场景描述:类承担了过多职责,或直接依赖非核心对象,导致职责混乱。
解决方案:明确类的职责边界,通过委托或接口隔离实现解耦。
案例:

  • 反例:Driver类直接操作CarEngine,违反职责单一原则。
  • 正例:Car类封装Engine的细节,仅提供startCar()接口,Driver仅与Car交互。

五、减少中间层依赖

场景描述:高层模块直接依赖底层实现细节,导致系统扩展困难。
解决方案:通过抽象接口或中间层隔离具体实现。
案例:

  • 反例:SchoolManager类直接操作CollegeManagerCollegeEmployee列表。
  • 正例:CollegeManager提供getEmployeeCount()方法,SchoolManager仅调用该方法获取统计信息。

六、信息隐藏与接口最小化

场景描述:类暴露了过多内部方法或属性,增加被误用风险。
解决方案:限制成员访问权限(如使用private/protected),仅暴露必要方法。
案例:

  • 反例:Engine类公有字段直接被Car类外访问。
  • 正例:Engine仅提供getFuelType()方法,Car类封装具体实现细节。

七、适用场景总结

  1. 大型复杂系统:模块间交互频繁时,通过迪米特法则降低耦合,提升可维护性。
  2. 频繁变更的模块:封装细节后,内部修改不影响外部调用。
  3. 第三方库集成:隐藏底层实现,仅暴露稳定接口。

八、注意事项

避免过度封装:可能引入冗余中介类,增加系统复杂度。

  • 权衡性能:间接调用可能带来额外性能开销,需结合场景评估。
    通过合理应用迪米特法则,可构建高内聚、低耦合的系统架构,显著提升代码的可扩展性和可维护性。实际开发中需结合其他原则(如单一职责、开闭原则)综合设计。
http://www.lryc.cn/news/623951.html

相关文章:

  • ​​Vue 3 开发速成手册
  • PHP现代化全栈开发:测试驱动开发与持续交付实践
  • MCP原理与开发及与大模型交互流程
  • 最小路径和
  • 【JAVASE】-9- 接口语法基础
  • Android中切换语言的方法
  • DNS总结
  • 【Linux内核】Linux信号机制
  • linux 常用代码
  • nodejs 错误处理
  • Collections.synchronizedList是如何将List变为线程安全的
  • vs studio 2017项目不支持studio vs2022
  • 【k8s】Kubernetes核心概念与架构详解
  • 从0实现系统设计
  • Leetcode 15 java
  • GitHub Copilot:AI编程助手的架构演进与真实世界影响
  • 浜掕仈缃戝ぇ鍘侸ava姹傝亴鑰呴潰璇曠幇鍦猴細褰撲弗鑲冮潰璇曞畼閬囦笂鎼炵瑧绋嬪簭鍛樿阿椋炴満
  • Conda 环境 在AI 私有化部署 有怎么用?
  • 电力设备状态监测与健康管理:基于多源异构数据融合的技术实现
  • 五、redis入门 之 客户端连接redis
  • 计算机网络 HTTP1.1、HTTP2、HTTP3 的核心对比及性能分析
  • ReactNode 类型
  • Java项目中短信的发送
  • 密码学系列 - 零知识证明(ZKP) - 多种承诺方案
  • Java ConcurrentHashMap 深度解析
  • 【LeetCode 热题 100】(八)二叉树
  • EC11编码器
  • 集成电路学习:什么是SIFT尺度不变特征变换
  • 43 C++ STL模板库12-容器4-容器适配器-堆栈(stack)
  • 基于DSP+ARM+FPGA架构的储能协调控制器解决方案,支持全国产化