极客大学架构师训练营 -- 编程的未来 面向对象 依赖倒置原则 -- 第二次作业
作业一:
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则 官方解释
依赖倒置原则,英文缩写DIP,全称Dependence Inversion Principle。
原始定义:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。
官方翻译:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
依赖倒置原则 程序员理解
应用代码中多使用抽象接口,尽量避免使用那些多变的具体实现类。
不要继承具体类,如果一个类在设计之初不是抽象类,那么尽量不要去继承它。对具体的继承是一种强依赖关系,维护的时候难以改变。
不要重写包含具体实现的函数.
依赖倒置举例
相比传统的软件设计架构,比如我们常说的经典的三层架构,Controller层依赖于Service层,Service层依赖于DAO层。由于每一层都是依赖于下层的实现,这样当某一层的结构发生变化时,它的上层就不得不也要发生改变,比如我们DAO里面逻辑发生了变化,可能会导致Service和Controller层都随之发生变化,这种架构是非常荒谬的!
好,这个时候如果我们换一种设计思路,高层模块不直接依赖低层的实现,而是依赖于低层模块的抽象,具体表现为我们增加一个IController接口(比如注册场景的Iregister),里面定义业务逻辑的接口,Controller层依赖于IController接口,Service层实现IController里面的接口,所以具体的业务逻辑则定义在Service,这个时候如果我们Service里面的逻辑发生变化,只要接口的行为不变,上层Controller里面就不用发生任何变化。
在经典的三层里面,高层模块直接依赖低层模块的实现,当我们将高层模块依赖于底层模块的抽象时,就好像依赖“倒置”了。这就是依赖倒置的由来。通过依赖倒置,可以使得架构更加稳定、更加灵活、更好应对需求变化。
好莱坞模式
为什么称为好莱坞原则,该原则是和好莱坞模式类似,don't call me ,i will call you。
作业二:
请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
JDBC 我们在java开发中访问数据库,代码并不直接依赖数据库驱动,而是依赖JDBC,当应用程序需要更换数据库,不需要修改任何代码。这正是因为应用代码,高层模块,不依赖数据库驱动,而是依赖抽象JDBC,而数据库驱动,作为底层模块,也依赖JDBC。
Tomcat、Spring 都是基于这个原则设计出来的,应用程序不需要调用Tomcat或者Spring这样的框架,而是框架调用应用程序。而实现这一特性的前提就是应用程序必须实现框架的接口规范,比如实现Servlet接口。
框架提供框架核心功能,比如HTTP处理,MVC等,并提供一组接口规范,应用程序只需要遵循接口规范编程,就可以被框架调用。程序使用框架的功能,但是不调用框架的代码,而是实现框架的接口,被框架调用,从而框架有更高的可复用性,被应用于各种软件开发中。
依赖倒置原则通俗说就是,高层模块不依赖底层模块,而是都是依赖抽象接口,这个抽象接口通常是由高层模块定义,底层模块实现。
作业三:
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
作业三提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。
类图
说明:
IClientCache 接口的方法暴露给程序调用,包含的方法有 put get delete
IRemoteCache 接口的方法,只能通过RemoteCache实现类实现,包含方法reBuild。
MainCache 聚合了RemoteCache, 存储为私有变量,以防被程序调用。
参考
https://blog.csdn.net/zhengzhb/article/details/7289269
https://zhuanlan.zhihu.com/p/24175489
https://www.liangzl.com/get-article-detail-165434.html
版权声明: 本文为 InfoQ 作者【John(易筋)】的原创文章。
原文链接:【http://xie.infoq.cn/article/256e52dd52a859d364492c0d9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论