源码分析七大设计原则之依赖倒置原则(Dependence Inversion Principle)

本文深入探讨了依赖倒置原则,强调高层模块与低层模块应依赖于抽象,而非具体实现。通过源码分析和反例说明,阐述了遵循该原则的重要性,如降低耦合度,提高系统可维护性和扩展性。并提供了实际编程中的应用指导,包括使用抽象类或接口,以及遵循里氏替换原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码分析之七大设计原则

一、依赖倒置原则(Dependence Inversion Principle)

定义:高层模块不应该依赖低层模块,二者都应该依赖于抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程

依赖倒置原则其实就是谁也不要依靠谁,除了约定的接口,大家都可以灵活自如。依赖倒置可以说是面向对象设计的标志

如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了
如果设计的各个部件或类相互依赖,这样就是耦合度高,难以维护和扩展,这也就体现不出面向对象的好处了

依赖倒置原则好比一个团队,有需求组,开发组,测试组
开发组和测试组都是面对同样的需求后,做自己相应的工作,而不是说测试组按照开发组理解的需求去做测试用例,也就是说开发组和测试组都是直接面向需求组工作,大家的目的是一样的,保证产品按时上线,需求是不依赖于开发和测试的

依赖倒置原则基于的设计理念:相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础的架构要稳定的多
在 Java 中,抽象指的是接口或抽象类,细节就是具体的实现类
使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

二、源码演练

反例代码,依赖倒置原则:上层不能依赖于下层,二者都应该依赖于抽象。调用别的方法的就是上层,被其他方法调用的就是下层

class RichPerson {
    // 人依赖于动物
    public void feed(ZangAo za) {
        System.out.println("开始喂养。。。");
        za.eat();
    }
    
    public void feed(Ostrich os) {
        System.out.println("开始喂养。。。");
        os.eat();
    }
}

class ZangAo {
    public void eat() {
        System.out.println("藏獒一顿吃十几斤肉类");
    }
}

class Ostrich {
    public  void eat() {
        System.out.println("鸵鸟吃植物类为生");
    }
}

如果现在多养一种动物,就需要在 RichPerson 类中添加 feed 方法,这样就导致上层依赖于下层,也就违背了依赖倒置原则

修改后的代码,如此一来每增加一种动物只需要扩展一个类即可

interface  Animal {
    void eat();
}

class RichPerson {
    public void feed(Animal animal) {
        System.out.println("开始喂养。。。");
        animal.eat();
    }
}

class ZangAo implements Animal {
    public void eat() {
        System.out.println("狗啃骨头");
    }
}

class Ostrich implements Animal {
    public  void eat(){
        System.out.println("猫吃鱼。。。");
    }
}
三、温馨提示

在实际编程中,一般需要做到以下三点:
1、低层模块尽量都要有抽象类或接口,或者两者都有
2、变量的声明类型尽量是抽象类或接口
3、使用继承时遵循里氏替换原则

依赖倒置原则的中心思想是面向接口编程,理解了面向接口编程,也就理解了依赖倒置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值