设计模式六大原则(3):依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在java中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

依赖倒置原则的核心思想是面向接口编程,我们依旧用一个例子来说明面向接口编程比相对于面向实现编程好在什么地方。场景是这样的,母亲给孩子讲故事,只要给她一本书,她就可以照着书给孩子讲故事了。代码如下:

运行结果:

妈妈开始讲故事

很久很久以前有一个阿拉伯的故事……

运行良好,假如有一天,需求变成这样:不是给书而是给一份报纸,让这位母亲讲一下报纸上的故事,报纸的代码如下:

这位母亲却办不到,因为她居然不会读报纸上的故事,这太荒唐了,只是将书换成报纸,居然必须要修改Mother才能读。假如以后需求换成杂志呢?换成网页呢?还要不断地修改Mother,这显然不是好的设计。原因就是Mother与Book之间的耦合性太高了,必须降低他们之间的耦合度才行。

我们引入一个抽象的接口IReader。读物,只要是带字的都属于读物:

Mother类与接口IReader发生依赖关系,而Book和Newspaper都属于读物的范畴,他们各自都去实现IReader接口,这样就符合依赖倒置原则了,代码修改为:

运行结果:

妈妈开始讲故事

很久很久以前有一个阿拉伯的故事……

妈妈开始讲故事

林书豪17+9助尼克斯击败老鹰……

这样修改后,无论以后怎样扩展Client类,都不需要再修改Mother类了。这只是一个简单的例子,实际情况中,代表高层模块的Mother类将负责完成主要的业务逻辑,一旦需要对它进行修改,引入错误的风险极大。所以遵循依赖倒置原则可以降低类之间的耦合性,提高系统的稳定性,降低修改程序造成的风险。

采用依赖倒置原则给多人并行开发带来了极大的便利,比如上例中,原本Mother类与Book类直接耦合时,Mother类必须等Book类编码完成后才可以进行编码,因为Mother类依赖于Book类。修改后的程序则可以同时开工,互不影响,因为Mother与Book类一点关系也没有。参与协作开发的人越多、项目越庞大,采用依赖导致原则的意义就越重大。现在很流行的TDD开发模式就是依赖倒置原则最成功的应用。

传递依赖关系有三种方式,以上的例子中使用的方法是接口传递,另外还有两种传递方式:构造方法传递setter方法传递,相信用过Spring框架的,对依赖的传递方式一定不会陌生。

在实际编程中,我们一般需要做到如下3点:

低层模块尽量都要有抽象类或接口,或者两者都有。

变量的声明类型尽量是抽象类或接口。

使用继承时遵循里氏替换原则。

依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。

来源:CSDN

原文:http://blog.csdn.net/zhengzhb/article/details/7289269

本文来自企鹅号 - Java开发者媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余林丰

桥接模式

桥接模式要把握的很重要的一点就是:类的继承关系和类的组合/聚合关系,何时应该考虑使用何种关系。是不是在编程过程中一味地使用类的继承关系就代表这就是面向对象编程了...

2117
来自专栏程序员互动联盟

编程大牛都有哪些基本功

第一部分:什么是基本功 先说说我所理解的基本功是什么:在讨论,计划,工作,策略以及其他一切相关于这个事物的活动时候,可以不用拿出来讨论的“技能”,但是却又是必...

3776
来自专栏Python中文社区

Why Not Python?

Python是一款简单强大又好用的动态语言,但我不解的是,为何这样一个好用的语言,在国外已经流行了十几年,但在国内不要说流行,问很多人的答案都是...

2368
来自专栏无原型不设计

UI / UX设计师如何玩转用户心理学原理?

以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具。 ? 众所周知,心理学在APP的用户体验设计中起着非常...

3197
来自专栏云加头条

腾讯云文件存储CFS香港地区上线,打造企业出海高速直通车

2017年11月22日,腾讯云率先在香港地区推出了文件存储CFS,以中国香港为中心辐射国外市场,满足公有云客户日益增长的业务出海需求。这也是国内首家在香港地区提...

1730
来自专栏企鹅号快讯

C加加是否到了生死存亡的时刻?不,C加加仍然在编程界任是不可替代的

C++是否逐步被取代 C++最能考察一个人对计算机知识掌握的能力。windows使用C、C++写的,现在又有qt、codeblocks等跨平台开发工具。可以这样...

2149
来自专栏子勰随笔

基于命令行的照片整理及查看工具

1555
来自专栏python小白到大牛

一行代码结果叹为观止,能做到这么极致的也只有python了

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Pyt...

1253
来自专栏栗霖积跬步之旅

序章:为什么学习使用kotlin、及kotlin的一些碎碎念

为什么使用kotlin? 当然是因为项目目前的开发语言是kotlin啊! 一方面是想能够尽快适应项目,另一方面,kotlin这门语言独特的语法,确实很吸引我,也...

3196
来自专栏C语言C++游戏编程

为何C语言如此强大?到底可以做什么?

C语言几乎是所有语言的实现基础,所以不存在做不了的事情,只是相对来说谁做更合适,编写游戏和软件都不是问题。

1230

扫码关注云+社区