【设计模式】七大原则之依赖倒转原则

依赖倒转原则(Dependence Inversion Principle)

基本介绍:

  1. 高层模块(调用方)不应该依赖低层模块(被调用方),二者都应该依赖其抽象

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

  3. 依赖倒转(倒置)的中心思想是面向接口编程

  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在 java 中,抽象指的是接口或抽象类,细节就是具体的实现类

  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

  6. 依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合

依赖倒转原则的作用:

  1. 依赖倒置原则可以降低类间的耦合性

  2. 依赖倒置原则可以提高系统的稳定性

  3. 依赖倒置原则可以减少并行开发引起的风险

  4. 依赖倒置原则可以提高代码的可读性和可维护性

应用实例:

  请编程完成 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 }

依赖关系传递的三种方式

  1. 接口传递

  2. 构造方法传递

  3. setter 方式传递

依赖倒转原则的注意事项和细节

  1. 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好

  2. 变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化

  3. 继承时遵循里氏替换原则(里氏替换原则将在下篇文章讲解)

原文链接:https://blog.csdn.net/qq784515681/article/details/105133851

原文地址:https://www.cnblogs.com/h--d/p/14531957.html