极客大学架构师训练营 -- 编程的未来 面向对象 依赖倒置原则 -- 第二次作业

发布于: 7 小时前

作业一:

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

依赖倒置原则 官方解释

依赖倒置原则,英文缩写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。

官方翻译:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。

依赖倒置原则 程序员理解

  1. 应用代码中多使用抽象接口,尽量避免使用那些多变的具体实现类。

  2. 不要继承具体类,如果一个类在设计之初不是抽象类,那么尽量不要去继承它。对具体的继承是一种强依赖关系,维护的时候难以改变。

  3. 不要重写包含具体实现的函数.

依赖倒置举例

相比传统的软件设计架构,比如我们常说的经典的三层架构,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 方法。

类图

说明:

  1. IClientCache 接口的方法暴露给程序调用,包含的方法有 put get delete

  2. IRemoteCache 接口的方法,只能通过RemoteCache实现类实现,包含方法reBuild。

  3. 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

发布于: 7 小时前 阅读数: 7
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

前阿里巴巴资深无线开发,目前汇丰银行专家。客户端架构师,全栈工程师。擅长算法、数据结构、设计模式、iOS、Java、 Spring Boot、Spring Cloud、Docker

评论

发布
暂无评论
极客大学架构师训练营--编程的未来 面向对象 依赖倒置原则 -- 第二次作业