依赖倒置原则

一、前言
依赖倒置原则也称依赖倒转原则(Dependence Inversion Principle)
看官方定义
高层模块不应该依赖底层模块,二者都应该依赖其抽象

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

依赖倒置的中心思想是面向接口编程

如果你了解点设计模式,应该理解上面的话,但是如果不了解的话,感觉说的云里雾里的,是不是一脸懵,懵这就对了,那就先看例子吧,会帮助你理解的!

二、举例说明

例子介绍(无聊的可看看,着急的请跳过)
能看下面的类图就看图,能看代码就看代码,我就是简单说一下例子的想法
如果你问身边的人或者看网上的代码都不是自己的思想,如果你没有勇气把公司的代码都用设计模式优化一遍,那就忍着,等你的架构师忍不住的时候再动手,但是如果学完东西不实操很容易就忘记。
那这就需要好的例子了,其实举例也是思想得一部分,懂得多了,就信手拈来,公司中好多人都会跟你说只可意会不可言传,我挺讨厌这句话的,说了等于没说,如果你不想继续当码农,不妨把生活应用于实践,别人问你什么你能用通俗易懂的例子告诉他,你就赢了!
因为我养着一条狗叫麦兜,心里又喜欢着猫,想在多年后一定要养一只布偶或者德文,所以我的很多例子都是很麦兜有关系,设计来源于生活!那下面的例子就是家庭养殖场养殖各种宠物的例子

1)类图说明
  • 直接上图:

在这里插入图片描述

  • 图说明了一切,以后再有新增动物,FamilyFarm 还会继续跟你合作,因为你让他省事到只写一次就为一生,太方便了!
package com.liu.susu.principle.inversion.example3;

/**
 * @FileName FamilyFarm
 * @Description 使用 依赖倒置原则 优化后的代码
 * @Author susu
 * @date 2022-02-13
 **/
public class FamilyFarm {

    public void raisePet(petGrowthProcess petGrowthProcess){
        petGrowthProcess.petBorn();
        petGrowthProcess.petGrowUp();
        petGrowthProcess.petBeRaised();
    }

}
interface petGrowthProcess{
    void petBorn();
    void petGrowUp();
    void petBeRaised();
}
class DogGrowthProcess implements petGrowthProcess{
    public void petBorn(){
        System.out.println("狗狗-->麦兜出生了……");
    }
    public void petGrowUp(){
        System.out.println("狗狗-->麦兜长大了……");
    }
    public void petBeRaised(){
        System.out.println("狗狗-->麦兜被饲养员带走了……");
    }
}

class CatGrowthProcess implements petGrowthProcess{
    public void petBorn(){
        System.out.println("小猫-->阿苔出生了……");
    }
    public void petGrowUp(){
        System.out.println("小猫-->阿苔长大了……");
    }
    public void petBeRaised(){
        System.out.println("小猫-->阿苔被饲养员带走了……");
    }
}

class ClientTest{
    public static void main(String[] args) {
        FamilyFarm familyFarm = new FamilyFarm();
        //饲养狗狗
        familyFarm.raisePet(new DogGrowthProcess());
        //饲养小猫
        familyFarm.raisePet(new CatGrowthProcess());
    }
}

package com.liu.susu.principle.inversion.example4;

/**
 * @FileName FamilyFarm
 * @Description 使用 依赖倒置原则 优化后的代码
 * @Author susu
 * @date 2022-02-13
 **/
public class FamilyFarm {

    public void raisePet(petGrowthProcess petGrowthProcess){
        petGrowthProcess.petBorn();
        petGrowthProcess.petGrowUp();
        petGrowthProcess.petBeRaised();
    }

}

interface petGrowthProcess{
    void petBorn();
    void petGrowUp();
    void petBeRaised();
}

class DogGrowthProcess implements petGrowthProcess{
    public void petBorn(){
        System.out.println("狗狗-->麦兜出生了……");
    }
    public void petGrowUp(){
        System.out.println("狗狗-->麦兜长大了……");
    }
    public void petBeRaised(){
        System.out.println("狗狗-->麦兜被饲养员带走了……");
    }
}

class CatGrowthProcess implements petGrowthProcess{
    public void petBorn(){
        System.out.println("小猫-->阿苔出生了……");
    }
    public void petGrowUp(){
        System.out.println("小猫-->阿苔长大了……");
    }
    public void petBeRaised(){
        System.out.println("小猫-->阿苔被饲养员带走了……");
    }
}

//新增功能饲养羊
class sheepGrowthProcess implements petGrowthProcess{
    public void petBorn(){
        System.out.println("小羊-->点点出生了……");
    }
    public void petGrowUp(){
        System.out.println("小羊-->点点长大了……");
    }
    public void petBeRaised(){
        System.out.println("小羊-->点点被饲养员带走了……");
    }
}

class ClientTest{
    public static void main(String[] args) {
        FamilyFarm familyFarm = new FamilyFarm();
        //饲养狗狗
        familyFarm.raisePet(new DogGrowthProcess());
        //饲养小猫
        familyFarm.raisePet(new CatGrowthProcess());
        //新增功能饲养羊
        familyFarm.raisePet(new sheepGrowthProcess());
    }
}

package com.liu.susu.principle.inversion.example5;

/**
 * @FileName FamilyFarm
 * @Description 使用 依赖倒置原则 优化后的代码
 * @Author susu
 * @date 2022-02-13
 **/
public class FamilyFarm {

    public void raisePet(petGrowthProcess petGrowthProcess){
        petGrowthProcess.petBorn();
        petGrowthProcess.petGrowUp();
        petGrowthProcess.petBeRaised();
    }

}

abstract class petGrowthProcess{
    public abstract void petBorn();
    public abstract void petGrowUp();
    public abstract void petBeRaised();
}

class DogGrowthProcess extends petGrowthProcess{
    public void petBorn(){
        System.out.println("狗狗-->麦兜出生了……");
    }
    public void petGrowUp(){
        System.out.println("狗狗-->麦兜长大了……");
    }
    public void petBeRaised(){
        System.out.println("狗狗-->麦兜被饲养员带走了……");
    }
}

class CatGrowthProcess extends petGrowthProcess{
    public void petBorn(){
        System.out.println("小猫-->阿苔出生了……");
    }
    public void petGrowUp(){
        System.out.println("小猫-->阿苔长大了……");
    }
    public void petBeRaised(){
        System.out.println("小猫-->阿苔被饲养员带走了……");
    }
}

//新增功能饲养羊
class sheepGrowthProcess extends petGrowthProcess{
    public void petBorn(){
        System.out.println("小羊-->点点出生了……");
    }
    public void petGrowUp(){
        System.out.println("小羊-->点点长大了……");
    }
    public void petBeRaised(){
        System.out.println("小羊-->点点被饲养员带走了……");
    }
}

class ClientTest{
    public static void main(String[] args) {
        FamilyFarm familyFarm = new FamilyFarm();
        //饲养狗狗
        familyFarm.raisePet(new DogGrowthProcess());
        //饲养小猫
        familyFarm.raisePet(new CatGrowthProcess());
        //新增功能饲养羊
        familyFarm.raisePet(new sheepGrowthProcess());
    }
}

三、总结

3.1 倒置?为什么叫倒置?
看完上面案例,现在明白了吗?
反例:家庭农场依赖狗狗猫猫的成长过程的细节
正例:狗狗猫猫羊羊都继承了 petGrowthProcess 接口(即:让细节依赖抽象),家庭农场 依赖抽象,不再依赖细节;这不就倒回来了嘛
3.3 再琢磨一下官方概念
琢磨概念之前先简单说一下Java基础:
在Java中,抽象指的是接口或者抽象类,而具体的实现类指的是细节。
依赖倒置基于细节应该依赖抽象等设计理念,相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的框架要稳定的多
使用接口或抽象类的目的是指定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现去完成。
即:依赖倒置的思想就是面向接口编程思想
3.4 作用
可以降低类间的耦合性。
可以提高系统的稳定性。
可以减少并行开发引起的风险。
可以提高代码的可读性和可维护性。
3.5 使用原则
底层模块,尽量都要有抽象类或者接口,或者两者都具备,这样程序的稳定性会更好;
变量的声明类型尽量是接口或者是抽象类。
使用继承时尽量遵循里氏替换原则。

posted @   蜡笔小新Belief  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示