依赖倒转原则(Dependence Inversion Principle)
基本介绍:
-
高层模块(调用方)不应该依赖低层模块(被调用方),二者都应该依赖其抽象
-
抽象不应该依赖细节,细节应该依赖抽象
-
依赖倒转(倒置)的中心思想是面向接口编程
-
依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在 java 中,抽象指的是接口或抽象类,细节就是具体的实现类
-
使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成
-
依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合
依赖倒转原则的作用:
-
依赖倒置原则可以降低类间的耦合性
-
依赖倒置原则可以提高系统的稳定性
-
依赖倒置原则可以减少并行开发引起的风险
-
依赖倒置原则可以提高代码的可读性和可维护性
应用实例:
请编程完成 Person 接收消息 的功能。
1) 实现方案1+分析说明
1 package com.atguigu.principle.inversion; 2 3 public class DependecyInversion { 4 5 public static void main(String[] args) { 6 Person person = new Person(); 7 person.receive(new Email()); 8 } 9 } 10 11 class Email { 12 13 public String getInfo() { 14 return "电子邮件信息: hello,world"; 15 } 16 } 17 18 // 完成 Person 接收消息的功能 19 // 方式 1 分析 20 // 1. 简单,比较容易想到 21 // 2. 如果我们获取的对象是 微信,短信等等,则新增类,同时 Perons 也要增加相应的接收方法 22 // 3. 解决思路:引入一个抽象的接口 IReceiver,表示接收者,这样 Person 类与接口 IReceiver 发生依赖 23 // 因为 Email,WeiXin 等等属于接收的范围,他们各自实现 IReceiver 接口就 ok,这样我们就符合依赖倒转原则 24 class Person { 25 26 public void receive(Email email) { 27 System.out.println(email.getInfo()); 28 } 29 }
2) 实现方案2(依赖倒转)+分析说明
1 package com.atguigu.principle.inversion.improve; 2 3 public class DependecyInversion { 4 5 public static void main(String[] args) { 6 // 客户端无需改变 7 Person person = new Person(); 8 person.receive(new Email()); 9 person.receive(new WeiXin()); 10 } 11 } 12 13 // 定义接口 14 interface IReceiver { 15 16 public String getInfo(); 17 } 18 19 class Email implements IReceiver { 20 21 public String getInfo() { 22 return "电子邮件信息: hello,world"; 23 } 24 } 25 26 // 增加微信 27 class WeiXin implements IReceiver { 28 29 public String getInfo() { 30 return "微信信息: hello,ok"; 31 } 32 } 33 34 // 方式 2 35 class Person { 36 //这里我们是对接口的依赖 37 public void receive(IReceiver receiver) { 38 System.out.println(receiver.getInfo()); 39 } 40 }
依赖关系传递的三种方式
-
接口传递
-
构造方法传递
-
setter 方式传递
依赖倒转原则的注意事项和细节
-
低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好
-
变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
-
继承时遵循里氏替换原则(里氏替换原则将在下篇文章讲解)
原文链接:https://blog.csdn.net/qq784515681/article/details/105133851