作业一:

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

依赖倒置原则 官方解释

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

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

  1. 可复制领导力 - 极客大学架构师训练营 架构师老A

    说明 分享人: 架构师老A 分享主题:<可复制领导力> 分享提纲: 个人能力成长阶梯 东西方领导力差异 管理者角色认知 架构师老A自我介绍 老A亲爱的老师们,同学们,大家好晚上,今晚由我给 ...

  2. 极客大学架构师训练营大作业

    大作业 背景 产品需求 技术方案建议 练习要求 用例图 泳道图 部署图 时序图 用户下单&支付 快递员位置上报 系统派单 订单状态图 背景 产品需求 技术方案建议 练习要求 用例图 说明: ● ...

  3. 极客大学产品经理训练营 产品文档和原型 作业4

    作业 [本周作业]写一个用例,挑一个:你自己的产品 / 你喜欢的产品 / [拍东西]发起拍卖/ [知识星球]加入星球/ [极客时间]购买课程: 1. 标题作者修改历史 标题:[极客时间]购买课程 作者 ...

  4. 极客大学产品经理训练营:业务流程与产品文档 第11课总结

    讲师:邱岳 1. 原型图 1.1 手绘图 + Scanner Pro 1.2 线框图 1.3 高保真产品图 1.4 做原型图的目的 坍缩:规划时梦到自己成了乔布斯,赶紧画个图让自己冷静冷静: 具体:具 ...

  5. 极客大学产品经理训练营:数据分析与商业分析,商业分析到业务分析 第18课总结

    讲师:邱岳 1. 产品经理眼中的利润.成本.收入 利润 = 收入 - 成本 奶茶利润率极高,达到60%左右.但是奶茶盈利比较难. 所有买水的产品利润率都极高,比如可口可乐,咖啡,奶茶等. 案例:有个面 ...

  6. 极客大学产品经理训练营:产品文档和原型咋弄 - 流程图 第9课总结

    讲师:邱岳 1. 图的意义 流程图.活动图.时序图.状态图,本次聚焦于过程和行为描述. 提效.宏观.点睛. 梳理思路 用例:做什么? 流程图:怎么做? 2. 流程图.活动图.时序图 3. 动手画 – ...

  7. 极客大学产品经理训练营 极客时间购买课程-大作业

    1. 标题作者修改历史 标题:[极客时间]购买课程 作者 历史 时间 易筋 创建 2021-01-09 易筋 添加购买流程图6 2021-03-02 易筋 添加购买时序图7 2021-03-16 2. ...

  8. 极客大学产品经理训练营:业务架构与概念模型 第10课总结

    讲师:邱岳 1. 什么是状态图 系统中的概念或对象随着一些事件的发生,改变了状态,通常这个状态比较多.比较复杂时,我们需要用状态图来表示他们的边界,以及触发状态转换的活动. 2. 动手画 – 员工状态 ...

  9. 极客大学产品经理训练营:产品经理的职业规划 第20课总结

    讲师:邱岳 1. 简历(你)作为产品 简历可能是你向你未来同事展示的第一个作品,关于你自己的经历.特点.审美,所以要像设计和研发一个产品那样设计好你的简历. 当谈论产品的时候,我们的思路应该依然是:用 ...

  10. 极客大学产品经理训练营:运营思维 第19课总结

    讲师:邱岳 1. 运营是做什么的 运转·经营. 产品经理经常拆房子.盖新房子.经营是要持续经营一个产品. CEO.COO(Apple 的Tim Cook以前就是).CTO.CFO.CIO- 运营其实是 ...

最新文章

  1. oracle参数文件initorcl位置,ORACLE参数文件
  2. Maven 的dependency 的 classifier的作用
  3. QT中的QTableView+QTableWidget
  4. android中gradle的作用,Gradle 之 Android 中的应用
  5. 第一次接触终极事务处理——Hekaton
  6. 横版网页游戏【一骑当先】地图原画资源
  7. 如何获取函数的变长参数(va_list, va_start, va_arg, va_end)
  8. 【案例】复制静止问题一则
  9. python调用C++
  10. Python命令行程序项目自动化GUI显示操作神器Gooey实践
  11. 【肌电信号】基于matlab GUI肌电信号处理【含Matlab源码 966期】
  12. sparksql处理mysql_Spark记录-SparkSQL远程操作MySQL和ORACLE
  13. STM32——MPU6050六轴传感器
  14. 上万条流行经典语录大全ACCESS数据库
  15. 【数学与算法】最小生成树Spanning Trees
  16. Hive 的 distribute by
  17. Linux静态库与动态库的概念及制作
  18. 保险行业的电子签章应用场景:印章统一管、合同在线签
  19. R语言用WinBUGS 软件对学术能力测验(SAT)建立层次(分层)贝叶斯模型
  20. Android post参数太长请求失败问题解决

热门文章

  1. mysql日期为00_MySQL 8.0.13设置日期为0000-00-00 00:00:00时出现的问题解决
  2. css盒模型(附图解)
  3. IAT 注入ImportInject(dll)
  4. 修改mysql数据存放路径
  5. Docker 三剑客之 Docker Swarm
  6. 2017 ZSTU寒假排位赛 #5
  7. 【译文】Nodejs官方文档(Part 3 断言测试)
  8. OpenSCAD通过循环快速复制几何对象
  9. linux fedora frebsd centos linux as 安装出错
  10. 14.1宽屏Intel集显调分辨率:无解