Java依赖于抽象不依赖于具体,Java的开发—面向对象的7大原则之依赖倒置原则(二)...

一.定义:

依赖倒置原则(Dependecy Inversion Principle)

原文为:

High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions

三层定义:

1.高层模块不应该依赖底层模块。两者都应该依赖于抽象

有人翻译成低层我个人理解是底层:底层就是说某个抽象的实现类这样的就是具体的实现

2.抽象不应该依赖于细节

3.细节应该依赖抽象

三层定义的理解:

1.高层模块:调用方;底层模块:被调用方也就是实现类

有说高层就是抽象类,然而并不是这样子,高层可以是抽象类也可以是具体的类或者某一实现类,它掉用别人它就是高层

2.模块之间通过抽象关联,实现类之间不直接依赖:依赖都通过抽象或者接口

3.抽象和接口不依赖于实现类

4.实现类不依赖于抽象和接口

5.就是面向抽象或者接口编程:降低耦合度,降低并行开发引起的风险,提高可读性和可维护性

深入理解:

依赖倒置原则的本质就是面向接口编程,通过抽象使各个类和模块之间彼此独立,互不影响,实现松耦合,开发过程中具体规则如下:

1.每个类尽量使用抽象类或者接口,或者两者都有

2.任何类都需要充接口或者抽象类派生

3.尽量不要重写基类已经写好的方法(里氏替换原则)

4.结合里氏替换原则:

接口负责定义public属性和方法,并申明和其他对象的依赖关系(通过接口或者抽象依赖),抽象类负责公共构造部分,实现类实现业务

二.场景示例

场景1:用户用的小米手机现用酷狗软件听歌

1 public classKuGoMusic {2

3 public voidplay(){4 System.out.println("heLlo kugo");5 }6 }7

8 public classXiaoMiPhone {9 privateKuGoMusic kuGoMusic;10

11 publicXiaoMiPhone(KuGoMusic kuGoMusic) {12 this.kuGoMusic =kuGoMusic;13 }14 public voidplay(){15 kuGoMusic.play();16 }17 }

需求变更:某天用户还想用QQ音乐,因为上面有酷狗没有的音乐,此时我们就需要修改小米手机类

1 public classXiaoMiPhone {2 privateKuGoMusic kuGoMusic;3 privateQQMusic qqMusic;4

5 publicXiaoMiPhone(KuGoMusic kuGoMusic, QQMusic qqMusic) {6 this.kuGoMusic =kuGoMusic;7 this.qqMusic =qqMusic;8 }9

10 public voidplayKugo(){11 kuGoMusic.play();12 }13 public voidplayQQ(){14 qqMusic.play();15 }16 }

如果用户还想使用网易音乐等等那么多音乐播放器,会造成  XiaoMiPhone这个类依赖的音乐类越来越多,代码越来越庞大

我们使用依赖倒置原则来优化代码

1.添加音乐接口;2.添加手机接口,增加对音乐接口的依赖

1 音乐接口2 public interfaceIMusic {3 public voidplay();4 }5 手机抽象类6 public abstract classIPhone {7 privateIMusic iMusic;8

9 publicIPhone(IMusic iMusic) {10 this.iMusic =iMusic;11 }12

13 public voidplay(){14 iMusic.play();15 }16

17 public abstract voidcall();18 }19 手机实现类20 public class RedMiPhone extendsIPhone {21

22 publicRedMiPhone(IMusic iMusic) {23 super(iMusic);24 }25 @Override26 public voidcall() {27 System.out.println("红米手机打电话");28 }29 }30

31 酷狗音乐32 public class KuGoMusic implementsIMusic{33 @Override34 public voidplay(){35 System.out.println("heLlo kugo");36 }37 }38

39 public class QQMusic implementsIMusic{40 @Override41 public voidplay(){42 System.out.println("QQ music");43 }44 }45

46 public static voidmain(String[] args) {47 IMusic kuGoMusic = newKuGoMusic();48 IMusic qqMusic = newQQMusic();49 System.out.println("我想使用酷狗");50 IPhone redMiPhone = newRedMiPhone(kuGoMusic);51 redMiPhone.play();52 redMiPhone.call();53 System.out.println("=============");54 System.out.println("我想使用qq音乐");55 redMiPhone = newRedMiPhone(qqMusic);56 redMiPhone.play();57 redMiPhone.call();58 }

测试结果:实现了随心转换,不论以后增加多少种音乐都不需要去改动高层代码,只需要增加低层代码就OK了

b27ce2f16fd8ddefa1e041527e16458a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值