面向对象设计原则-03依赖倒置原则

依赖倒置原则的定义

依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Robert C.Martin)于 1996 年在 C++ Report 上发表的文章。
依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口编程,不要面向实现编程。

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

由于在软件设计中,细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定得多。这里的抽象指的是接口或者抽象类,而细节是指具体的实现类。

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

依赖、倒置原则的作用

依赖倒置原则的主要作用如下:
1、依赖倒置原则可以降低类间的耦合性。
2、依赖倒置原则可以提高系统的稳定性。
3、依赖倒置原则可以减少并行开发引起的风险。
4、依赖倒置原则可以提高代码的可读性和可维护性。

依赖倒置原则的实现方法

依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。
1、每个类尽量提供接口或抽象类,或者两者都具备。
2、变量的声明类型尽量是接口或者是抽象类。
3、任何类都不应该从具体类派生。
4、使用继承时尽量遵循里氏替换原则。

下面以“顾客购物程序”为例来说明依赖倒置原则的应用。

【例1】依赖倒置原则在“顾客购物程序”中的应用。

分析:本程序反映了 “顾客类”与“商店类”的关系。商店类中有 sell() 方法,顾客类通过该方法购物以下代码定义了顾客类通过韶关网店 ShaoguanShop 购物:

class Customer {public void shopping(ShaoguanShop shop) {//购物System.out.println(shop.sell());}
}

但是,这种设计存在缺点,如果该顾客想从另外一家商店(如婺源网店 WuyuanShop)购物,就要将该顾客的代码修改如下:

class Customer {public void shopping(WuyuanShop shop) {//购物System.out.println(shop.sell());}
}

顾客每更换一家商店,都要修改一次代码,这明显违背了开闭原则。存在以上缺点的原因是:顾客类设计时同具体的商店类绑定了,这违背了依赖倒置原则。解决方法是:定义“婺源网店”和“韶关网店”的共同接口 Shop,顾客类面向该接口编程,其代码修改如下:

class Customer {public void shopping(Shop shop) {//购物System.out.println(shop.sell());}
}

这样,不管顾客类 Customer 访问什么商店,或者增加新的商店,都不需要修改原有代码了

public class DIPtest {public static void main(String[] args) {Customer wang = new Customer();System.out.println("顾客购买以下商品:");wang.shopping(new ShaoguanShop());wang.shopping(new WuyuanShop());}
}
//商店
interface Shop {public String sell(); //卖
}
//韶关网店
class ShaoguanShop implements Shop {public String sell() {return "韶关土特产:香菇、木耳……";}
}
//婺源网店
class WuyuanShop implements Shop {public String sell() {return "婺源土特产:绿茶、酒糟鱼……";}
}
//顾客
class Customer {public void shopping(Shop shop) {//购物System.out.println(shop.sell());}
}

程序的运行结果如下:

顾客购买以下商品:
韶关土特产:香菇、木耳……
婺源土特产:绿茶、酒糟鱼……

面向对象设计原则-03依赖倒置原则相关推荐

  1. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  2. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  3. 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则

    目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...

  4. 设计模式六大原则之里氏替换原则、依赖倒置原则详解

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

  5. 3.六大原则例子-- 依赖倒置原则(DIP)例子

    设计模式六大原则例子-- 依赖倒置原则(DIP)例子 之前我们对设计模式的六大原则做了简单归纳,这篇博客是对依赖倒置原则进行的举例说明. 依赖倒置原则的意义 DIP是6大原则中最难以实现的原则,它是实 ...

  6. 面向对象七大设计原则之依赖倒置原则

    熟练掌握和应用面向对象设计七大原则,是初中级工程师向高级/资深工程师进阶的一个必备技能.他可以大大的提升程序的可复用性和可维护性是重构代码的一大利器. 本人菜鸟一枚本面文章的出发点是1.加深个人印象. ...

  7. 【软件架构设计原则】开闭原则和依赖倒置原则

    文章目录 软件架构设计原则 开闭原则 依赖倒置原则 最后 软件架构设计原则 本文通过实例来讲解 开闭原则 依赖导致原则 开闭原则 开闭原则(Open-Close Principle,OCP)是指一个软 ...

  8. 六大设计原则之依赖倒置原则07

    目录 1.概述 2.业务场景 3.运用设计原则前代码实现 3.1.代码实现 3.2.总结 4.运用设计原则后代码实现 4.1.代码实现 4.2.总结 1.概述 依赖倒置原则(Dependence In ...

  9. 6大设计原则之依赖倒置原则

    依赖倒置原则: 包含三层含义: 高层模块不应该依赖低层模块,二者应该依赖抽象 抽象不应该依赖细节 细节应该依赖抽象 再精简些就是:其核心是面向接口编程 抽象:即抽象类和接口,抽象是对实现的约束,对依赖 ...

最新文章

  1. ni visa pci_CHINACOAT 2019“推荐品牌”赫普菲乐|PCI可名文化出品
  2. 贷款利率最高多少合法?
  3. html编辑器自定义脚本,CKeditor富文本编辑器使用技巧之添加自定义插件的方法
  4. 微服务业务体系内对复用的深度探讨
  5. Set集合设置变量自增长
  6. [EOJ]2019 ECNU XCPC March Selection #1 F
  7. 博纳影业IPO即将过会 阿里、腾讯均为股东
  8. java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId
  9. ajax submit 文件上传,ajaxSubmit() 上传文件和进度条显示
  10. RBF神经网络学习及实践
  11. graphormer 代码阅读
  12. 高中时代的黑历史产物
  13. C++ 笔记 加号运算符重载
  14. dreamweaver CC 快捷键
  15. 十大著名黑客-----埃里克-雷蒙德
  16. 超火壁纸!隐藏 Dock 栏+AirTag 渐变
  17. [IPhone] 如何将制作图片放大缩小的动作
  18. 如何选择企业即时通讯软件?
  19. 计蒜客信息学入门赛 #16--B
  20. Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

热门文章

  1. 分布式系统设计模式,你用过哪些?
  2. HTML5+CSS3小实例:酷炫的ANIPLEX文字特效
  3. HTML5+CSS3小实例:抽屉式分享按钮切换效果
  4. HashMap和Iterator迭代器的小用法
  5. CSP 2017-12
  6. csp 2022.6
  7. Automatic Software Repair: A Survey 自动软件修复:综述 (2)
  8. SQL存储过程根据,循环取出数据
  9. System.Globalization.CultureInfo.InvariantCulture失效
  10. Qt的QProgressDialog使用两条总结(去掉帮助和关闭、设置尺寸)