【设计模式笔记】依赖倒转原则

帅比萌擦擦* 提交于 2019-11-28 11:59:08

依赖倒转原则

DIP / Dependency inversion principle


尚硅谷设计模式-学习笔记


----------------依赖倒转原则基本介绍

  1. 高层模块不应该依赖底层模块,两种都应该依赖其抽象(接口或者抽象类)
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 依赖倒转/依赖倒置的中心思想是面对接口编程
  4. 依赖倒转原则基于这样的设计理念:
    相对于细节的多变性,抽象的东西要稳定的多。
    以抽象为基础搭建的架构比以细节为基础的架构要稳定得多。
    在Java中,抽象指的是接口或者抽象类,细节就是具体的实现类
  5. 使用接口或者抽象类的目的就是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

----------------依赖倒转原则实例

实例:请编程完成Person 接收消息的功能
对比传统方案和遵守原则的方案

	Example:传统方案
	
        public class DIP1 {
            public static void main(String[] args) {
                Person p = new Person();
                p.receive(new Email());
            }
        }

        //完成Person接收消息的功能

        //注意,这个地方Person类的方法依赖Email类
        //这种方式比较简单,比较容易想到
        //但是如果我们获取的对象不止邮件,还有微信,短信。则我们需要新增类,Person类还需要增加新的接收方法
        //解决思路:引入一个抽象的接口IReceiver表示接收者,这样Person类与这个接口发生依赖

        //这样做有什么好处呢?
        //	 因为Email, 微信等等属于接收的范围,他们各自实现了IReceiver这个接口,就符合了依赖倒转原则

        class Person{
            
            public void receive(Email email) { 
                System.out.println(email.getInfo());
            }
        }

        class Email{
            public String getInfo() {
                return "电子邮件信息 : Hello World";
            }
        }
    .
 Example: 改进方案(遵守依赖倒转原则)
 
     public class DIP2 {
         public static void main(String[] args) {
             //客户端无需改变
             
             Person p = new Person();
             p.receive(new Email());
             p.receive(new Weixin());
         }
     }

     //定义一个接口IReceiver

     interface IReceiver{
         public String getInfo();
     }

     class Person{
         
         public void receive(IReceiver receiver) { 
         //这里的依赖的由Email类变成了IReceiver接口
             
             System.out.println(receiver.getInfo());
         }
     }

     class Email implements IReceiver{
         public String getInfo() {
             return "电子邮件信息 : Hello World";
         }
     }

     //增加微信类
     class Weixin implements IReceiver{
         public String getInfo() {	
             return "微信信息 : Hello World";
         }
     }
 .

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

  1. 底层模块尽量都要有抽象类和接口,或者两者都有,程序稳定更好
  2. 对象的声明类型尽量为抽象类或者接口,这样我们的对象和类间,就存在一个缓冲层,利于程序扩展和优化
  3. 继承时遵循里氏替换原则
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!