zoukankan      html  css  js  c++  java
  • 【设计模式】七大原则之依赖倒转原则

    依赖倒转原则(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
Copyright © 2011-2022 走看看