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

java 迪米特法则,原理、思想、工作流程、实现细节、稳定性、优缺点、应用场景等

迪米特法则(Law of Demeter,LoD),也被称为“最少知识原则”,是一种指导面向对象设计的原则,旨在减少对象之间的耦合度。以下是对迪米特法则的详细解析。

1. 定义

迪米特法则指出:一个对象应该对其他对象有最少的了解。换句话说,一个对象不应该知道其他对象的内部细节,只应与直接的朋友(即直接依赖的对象)交互。

2. 基本思想

基本思想是降低模块之间的耦合度,减少对象间的直接依赖关系,从而提高系统的灵活性和可维护性。通过限制对象之间的交互,可以使得系统在面对变化时具有更好的适应性。

更多优质资源:
http://sj.ysok.net/jydoraemon 访问码:JYAM

3. 基本原理

  • 直接交流:对象只与它直接交互的对象进行交流,不应依赖于其他对象的内部结构或状态。
  • 封装性:通过隐藏对象的内部实现细节,保护对象的完整性。
  • 信息隐藏:通过减少对象间的相互依赖,增强系统的模块化。

4. 工作流程

  1. 确定一个对象的职责和其直接依赖的对象。
  2. 使对象只与其直接依赖的对象交互,不与其他对象的内部结构进行交互。
  3. 通过方法参数或返回值传递信息,而不是直接访问对象的属性。

5. 反例代码

不遵循迪米特法则的案例:

class Engine {
    public void start() {
        System.out.println("Engine started.");
    }
}

class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine();
    }

    public Engine getEngine() {
        return engine;
    }
}

class Driver {
    public void drive(Car car) {
        // Driver knows about Car's internal structure
        car.getEngine().start(); // 违反迪米特法则
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        Driver driver = new Driver();
        driver.drive(car);
    }
}

在这个例子中,Driver 类直接访问了 Car 类的内部实现(即 Engine),这违反了迪米特法则。

6. 正例代码实现

遵循迪米特法则的实现如下:

class Engine {
    public void start() {
        System.out.println("Engine started.");
    }
}

class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine();
    }

    // Car 提供一个启动引擎的方法
    public void start() {
        engine.start(); // Car 负责与 Engine 的交互
    }
}

class Driver {
    public void drive(Car car) {
        // Driver 只知道 Car 提供的接口,而不关心 Car 的内部实现
        car.start(); // 安全且符合迪米特法则
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        Driver driver = new Driver();
        driver.drive(car);
    }
}

7. 代码分析讲解

  • 在遵循迪米特法则的实现中,Driver 类只与 Car 类交互,而不直接访问 Car 的内部实现。
  • Car 类提供了一个 start() 方法,封装了与 Engine 的交互。这样,Driver 不需要了解 Car 的具体实现细节。
  • 这种设计使得 Car 的实现可以更改而不影响 Driver,提高了代码的灵活性和可维护性。

8. 复杂度分析

  • 时间复杂度:迪米特法则本身对时间复杂度没有直接影响,具体实现的复杂度取决于业务逻辑。
  • 空间复杂度:遵循迪米特法则可能导致更多的类和方法,但由于对象之间的耦合度降低,整体系统的可维护性提高,空间复杂度的增加是合理的。

9. 稳定性

通过减少对象之间的依赖关系,遵循迪米特法则可以提高系统的稳定性。系统的某个部分发生变化时,其余部分的影响最小化,从而降低了错误发生的概率。

10. 优缺点

优点

  • 降低了对象之间的耦合度,使系统更加灵活。
  • 增强了信息隐藏和封装性,保护了对象的内部状态。
  • 提高了代码的可读性和可维护性,便于理解和使用。

缺点

  • 可能会导致类的数量增多,增加管理成本。
  • 对于简单的系统,遵循迪米特法则可能显得过于复杂。

11. 实际应用

  • 在大型系统中,特别是分层架构中,遵循迪米特法则可以有效降低各层之间的耦合度。
  • 在微服务架构中,通过限制服务之间的交互,增强服务的独立性和模块化。

12. 总结

迪米特法则强调对象之间应有最少的知识,降低对象之间的依赖关系,从而提高系统的灵活性和可维护性。通过遵循这一原则,开发人员可以构建出更具模块化、可扩展性的系统,适应不断变化的需求。在实际开发中,理解和应用迪米特法则将有助于提高代码质量和系统的稳定性。


http://www.kler.cn/a/505945.html

相关文章:

  • 代理模式实现
  • 大疆上云API基于源码部署
  • 如何修复Android上未安装的应用程序
  • 宇泰串口卡驱动在Ubuntu22.04编译、安装汇总
  • Python贪心
  • vue3 uiapp实现一个数字输入组件, 舒服非数字会默认转成最小数
  • C语言基本知识复习浓缩版:数组
  • 碰一碰发视频源码搭建技术剖析,支持OEM
  • 数字普惠金融对新质生产力的影响研究(2015-2023年)
  • ZooKeeper 核心知识全解析:架构、角色、节点与应用
  • Dify应用-工作流
  • 单头注意力机制(SHSA)详解
  • Spring Boot DevTools(官网文档解读)
  • Jenkins安装配置遇到问题及解决方案(Windows版本)
  • CDH5.16.2部署
  • elastic聚合总结
  • STM32 HAL库函数入门指南:从原理到实践
  • Flutter使用BorderRadiusTween实现由矩形变成圆形的动画
  • CPU缓存学习
  • 关于Profinet 从站转 EtherNet/IP 从站网关详细说明
  • 3. Flink 窗口
  • Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)
  • 计算机网络_重点梳理
  • 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
  • 金融项目实战 05|Python实现接口自动化——登录接口
  • VMWARE linux LVM 扩容磁盘分区