美文网首页
设计原则(2) : 依赖倒置原则

设计原则(2) : 依赖倒置原则

作者: a_salt_fish | 来源:发表于2019-01-13 14:41 被阅读0次

高层模块不应当依赖底层模块, 二者都应该依赖其抽象(抽象不应当依赖细节, 细节应当依赖抽象)

这个定义比较抽象, 直接上代码

  • 现在我来实现一个熊猫吃东西的业务,可以吃的东西有bamboo shoots(竹笋) bamboo leaves(竹叶)等
public class Panda1 {
    public void eatBambooShoots(){
        System.out.println("eat bamboo shoots");
    }
    public void eatBambooLeaves(){
        System.out.println("eat bamboo leaves");
    }
}

ok, 代码已经完成了, 来测试一下

public class Test1 {
    public static void main(String[] args) {
        Panda1 panda = new Panda1();
        panda.eatBambooLeaves();
        panda.eatBambooShoots();
    }
}

run, 没问题. 但是这时候问题来了, 熊猫馆又给熊猫增加了一种新的食品food3 (- . -emmm...名字起得随意了点,不要在意这些细节)
这时候我不得不修改 Panda1这个类, 增加一个新的方法eatFood3,同时修改客户端 增加panda.eatFood3();
在这个例子中 Test作为调用者 ,是 高层模块, Panda类作为被调用者 是底层模块, 当Panda新增加一种食品时Test作为高层必须要等底层的Panda增加方法之后才能实现业务,很明显依赖了底层的模块,这就违背了依赖倒置原则.

  • 我们来重新设计一版
    将熊猫的食物抽象出来
public interface PandaFood {
    String getFoodName();
}

Panda2 吃食物,吃的食物由调用者传入

public class Panda2 {
    public void eatPandaFood(PandaFood pandaFood){
        System.out.println("eat " + pandaFood.getFoodName());
    }
}

定义食物

public class BambooLeaves implements PandaFood {
    @Override
    public String getFoodName() {
        return "bamboo leaves";
    }
}
public class BambooShoots implements PandaFood {
    @Override
    public String getFoodName() {
        return "bamboo shoots";
    }
}

客户端Test2

public class Test2 {
    public static void main(String[] args) {
        Panda2 panda = new Panda2();
        PandaFood leaves = new BambooLeaves();
        PandaFood shoots = new BambooShoots();
        panda.eatPandaFood(leaves);
        panda.eatPandaFood(shoots);
    }
}

run ... 得到跟Test1一样的结果, 这时新增了一种食物Food3 ,我们只需要新增加一种PandaFood的实现并修改Test2即可,完全无需对底层的类做任何修改, 这里最关键的部分是对PandaFood的抽象,并且在Panda2类中的eatFood方法中的入参是PandaFood, 即面向接口编程,而不是面向细节.

第三种模式, 通过构造器或set方法注入的方式(Spring常用的模式)

public class Panda3 {
    private PandaFood pandaFood;
    public Panda3(PandaFood pandaFood) {
        this.pandaFood = pandaFood;
    }
    public void setPandaFood(PandaFood pandaFood) {
        this.pandaFood = pandaFood;
    }
    public void eatPandaFood(){
        System.out.println("eat " + pandaFood.getFoodName());
    }
}

这样 调用 eatPandaFood 时就无需关心到底要吃什么, 代码的耦合性更低, 更容易维护

github源码

相关文章

  • 软件架构设计原则之依赖倒置原则

    1 依赖倒置原则 依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码...

  • 依赖倒置原则

    个人博客原文:依赖倒置原则 设计模式六大原则之三:依赖倒置原则。 简介 姓名 :依赖倒置原则 英文名 :Depen...

  • 六大设计原则 -依赖倒置原则【Dependence Invers

    六大设计原则 单一职责原则 里式替换原则 依赖倒置原则 接口隔离原则 迪米特原则 开闭原则 依赖倒置原则 定义:高...

  • 设计原则(2) : 依赖倒置原则

    高层模块不应当依赖底层模块, 二者都应该依赖其抽象(抽象不应当依赖细节, 细节应当依赖抽象) 这个定义比较抽象, ...

  • 设计模式的设计原则

    设计模式的设计原则 面向对象五大设计原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 开闭原则 设计模...

  • 面向对象的8大设计原则

    面向对象设计8大原则: 1.依赖倒置原则 实现依赖抽象,抽象不依赖实现。 2.开放-关闭原则 开放拓展,关闭修改 ...

  • Java 依赖倒置 控制反转

    软件开发六大设计原则 合称SOLID 依赖倒置原则也是其中一个 依赖倒置原则定义: 上层模块不应该依赖底层模块,它...

  • 第二周

    请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则? 依赖倒置原则 Dependency Inv...

  • C++设计模式 Week1 (Boolan) by Im4lis

    1-设计模式简介2-面向对象设计原则面向对象设计的八大原则:1、依赖倒置原则(DIP):稳定的部分不应该依赖于变化...

  • Swift设计模式----目录

    面向对象设计原则: 开闭原则 单一职责原则 依赖倒置原则 接口分离原则 迪米特法则 里氏替换原则 面向对象设计模式...

网友评论

      本文标题:设计原则(2) : 依赖倒置原则

      本文链接:https://www.haomeiwen.com/subject/xrzkdqtx.html