java依赖倒转原则_JAVA设计模式七大原则之:(二)依赖倒置原则

一、定义

依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖抽象。

核心思想:面向接口编程

二、描述

类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

可以将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

三、优点

1.可以减少类与类之间的耦合性,提高系统的稳定性。

2.提高代码的可读性和可维护性。

3.并能够降低修改程序所造成的风险。

四、示例

我们以一个学习案例为演示。

/**

* Create By Ke Shuiqiang 2020/3/5 15:59

* 高层模块

*/

public class ZhangSan {

//张三开始学习

public void study(JavaCourse javaCourse){

javaCourse.startStudy();

}

}

/**

* Create By Ke Shuiqiang 2020/3/5 16:43

* 底层模块

*/

public class JavaCourse {

public void startStudy(){

System.out.println("开始学习JAVA");

}

}

/**

* Create By Ke Shuiqiang 2020/3/5 16:40

*/

public class Test {

public static void main(String[] args) {

ZhangSan zhangSan = new ZhangSan();

System.out.println("准备学习");

zhangSan.study(new JavaCourse());

System.out.println("学习完毕");

}

}

准备学习

开始学习JAVA

学习完毕

在这个示例中告诉我们,张三很喜欢学习,并且喜欢学习JAVA,但是有一天张三忽然不想学JAVA了,他想学点别的比如Python。

/**

* Create By Ke Shuiqiang 2020/3/5 16:43

*/

public class PythonCourse {

public void startStudy(){

System.out.println("开始学习Python");

}

}

但是我们发现,张三没有这个能力,他只会学习JAVA。如果我们想赋予张三这个能力,我们只能修改ZhangSan中的代码,但是张三每次想学习新得知识,我们都要修改ZhangSan中的代码吗?这显然是及其不合理的设计,原因就是ZhangSan和JavaCourse之间的耦合度太高了,必须降低它们之间的耦合度。

我们可以把JavaCourse和PythonCourse抽象化,抽取的共同点。

/**

* Create By Ke Shuiqiang 2020/3/5 17:12

*/

public interface Course {

void startStudy();

}

/**

* Create By Ke Shuiqiang 2020/3/5 15:59

*/

public class ZhangSan {

public void study(Course course){

course.startStudy();

}

}

/**

* Create By Ke Shuiqiang 2020/3/5 16:40

*/

public class Test {

public static void main(String\[\] args) {

ZhangSan zhangSan = new ZhangSan();

System.out.println("准备学习");

zhangSan.study(new JavaCourse());

System.out.println("学习完毕");

System.out.println("------------------");

System.out.println("准备学习");

zhangSan.study(new PythonCourse());

System.out.println("学习完毕");

}

}

准备学习

开始学习JAVA

学习完毕

------------------

准备学习

开始学习Python

学习完毕

修改后的代码ZhangSan不与任何具体的实现产生依赖关系,而是与它们的接口Course产生依赖关系。这样就符合了我们的依赖倒置原则。不管以后ZhangSan想学习AI还是PHP都不需要修改ZhangSan中的代码,只要实现Course就可以。

实际上这是一种大家非常熟悉的方式,叫依赖注入。注入的方式还有构造器方式和setter方式。

setter注入:

/**

* Create By Ke Shuiqiang 2020/3/5 15:59

*/

public class ZhangSan {

private Course course;

public void setCourse(Course course) {

this.course = course;

}

public void study(){

this.course.startStudy();

}

}

构造器注入:

/**

* Create By Ke Shuiqiang 2020/3/5 15:59

*/

public class ZhangSan {

private Course course;

public ZhangSan(Course course) {

this.course = course;

}

public void study(){

this.course.startStudy();

}

}

继承关系:

76c76bfcbf4ebba14d77022768bef9f6.png

在实际编程中,我们一般需要做到如下3点:

低层模块尽量都要有抽象类或接口,或者两者都有。

变量的声明类型尽量是抽象类或接口。

使用继承时遵循里氏替换原则。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值