依赖反转(倒置)原则(Dependency inversion principle,DIP)

在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下:

此篇来学习一下依赖反转(倒置)原则(Dependency Inversion Principle)

定义如下:

A. High-level modules should not depend on low-level modules. Both should depend on abstractions.

B. Abstractions should not depend on details. Details should depend on abstractions.

即:

A、高层次的模块不要依赖于低层次的模块,都应该依赖于抽象(接口)。

B、抽象(接口)不应该依赖于具体,而具体要依赖于抽象。

我们来具体理解一下哈,比如说,码农小明穿一件毛衣,可能是圆领的也可能是鸡心领的,可能是蓝色的,也可能是红色的。

    interface Coder {
        void wearSweater(Sweater sweater);
    }

    class XiaoMing implements Coder{
        @Override
        public void wearSweater(Sweater sweater) {

        }
    }

    interface Sweater {

    }

    class TneckSweater implements Sweater {

    }

然后我们再看看client代码是怎么写的:

        Coder xiaoming = new XiaoMing();
        Sweater tneckSweater = new TneckSweater();
        xiaoming.wearSweater(tneckSweater);

我们假设项目组Coder有小明、大龙、老张等6个,他们有的喜欢看韩剧,有的喜欢看动漫,有的喜欢林志玲,有的喜欢听摇滚。但是他们可能在天冷的时候都会穿毛衣,有穿美特斯邦威的,有穿以纯的。那么我们在写代码的时候,知道接口都有穿毛衣这个方法,针对不同的毛衣,我们创建不同的实例,只要号码没问题,都可以穿上。扩展起来是不是很方便。

我们看到,是针对更加抽象的interface来编程,具体的类依赖于抽象的接口。即对于具体的类来说,不要互相依赖,而要针对接口编程。

Applying Dependency Inversion Principle

这张图我们也可以比较直观的看到依赖反转原则的应用。

依赖反转原则基于这样的情况:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。

使用DIP的优点:

  • 减少类之间的耦合
  • 提高系统的稳定性
  • 提高系统的可维护性和可扩展性

当然,使用这个原则会导致有更多的类和接口来维护,但是更加灵活。 依赖反转原则不应该盲目使用在模块中。比如一些功能类之类的,则不需要使用这个原则。

最佳实践:

  • 每个类尽量有借口或者抽象类
  • 变量的类型尽量声明为借口或者抽象类
  • 尽量不要复写父类的方法
  • 结合里氏替换原则来使用

参考:

https://en.wikipedia.org/wiki/Dependency_inversion_principle

http://blog.csdn.net/moxiaoya1314/article/details/51899048

https://springframework.guru/principles-of-object-oriented-design/dependency-inversion-principle

《设计模式之禅》

[《The Dependency Inversion Principle》](

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值