写点什么

第二周作业

用户头像
晴空万里
关注
发布于: 2020 年 11 月 01 日

依赖倒置原则:

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

  • 高层模块不能依赖低层模块,而是大家都依赖于抽象;

  • 抽象不能依赖于实现,而是实现依赖抽象;



当我们软件开发的时候,它一定有一些代码,有一些模块,有一些类,有一些组件,它是属于高层的,它来调用低层,那么常规的,一个高层模块,调用低层模块,那么它就是依赖低层模块,低层模块被高层模块依赖,才能够完成软件的正常运行,但是依赖倒置原则告诉我们说,高层模块不能够依赖低层模块,而是都依赖一个抽象,同时抽象也不能依赖实现,而是实现依赖抽象。



日常开发中,当我们高层模块依赖低层模块的时候,那么被依赖的代码、被依赖的模块总要先开发出来,然后高层模块才能够调用已经开发出来的低层模块,而现在反过来,基于依赖倒置原则,高层模块不再依赖低层模块,而是依赖一个抽象,这个抽象是一个规范,可能是个接口,可能是个配置,然后大家都依赖这个接口,这个规范进行编程,所以开发顺序就变成了,我们要先开发好这个接口,这个抽象,然后基于这个抽象 高层模块去调用这个接口,所有说,依赖倒置原则也倒置了模块或者包或者是类的依赖关系,同时也倒置了开发的顺序和职责。



例如Service是高层模块,我们的DLL是低层模块,那么Service调用了DLL然后DLL其实会提供了一组DLL接口供Service调用,这种不满足依赖倒置原则,那么真正的依赖倒置是说,Service定义一个接口,然后Service去调用而DLL去实现这个接口,也就是这个接口应该是属于高层模块的,高层模块定义一个接口,高层可以根据自己的使用场景,进行模块接口的设计,低层去实现它,那么接口的定义就定义了它们之间的依赖关系和合作关系。



下图是遵循了依赖倒置原则DIP设计的关系图





Policy层依赖一个Policy的接口层,而机械层Mechanism Layer去实现这个接口层,这个时候我们看到Policy不再依赖机械层,同样的Mechanism层也不再依赖Utility层而是依赖Mechanism接口,而Utility去实现这个接口,这样的话,每一个高层都不依赖低层,而是依赖自身的接口,而这个接口是属于高层的,高层和低层之间的依赖关系被打破了,那么在新的环境中,高层需要重用、复用,只需要重新对接口进行实现就行了。



我们看一个反例





当灯按下poll的时候然后控制灯的开关,这个时候Button算是高层,Lamp算是低层模块,高层模块直接依赖低层模块,当复用高层模块的时候,难以复用,同时它强硬的依赖了低层。



看一个依赖倒置的修改



在上面这个设计里面Button不再依赖Lamp而是依赖一个抽象的接口叫ButtonServer,它属于高层模块,高层模块依赖于一个属于高层模块的抽象接口,而低层模块去实现这个接口,从而使得依赖关系被倒置了。

当我们想要复用Button的时候,我们可以把Button复用到任何地方,Button按下的时候会调ButtonServer但在一个新的地方ButtonServer不再是一个Lamp的时候,它可以是一个起重机可以是一个导弹发射按钮,只要实现这个ButtonServer接口都可以了,因为它们之间不再耦合,没有任何关系,所以依赖倒置原则也是框架设计的核心。



为什么依赖倒置原则又被称为好莱坞原则?

好莱坞规则就是:“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。

梦想进入好莱坞的人们,你们不要找好莱坞。那怎么办呢?答案是,让好莱坞来找你!

这就是非常著名的好莱坞原则。



软件工程与之类似,框架设计里面,我们的应用程序是不应该去调用框架的,而是框架调用我们的应用程序。Don't call 框架,框架 will call 代码。框架定义一组接口,框架基于这组接口进行开发,进行调用Web请求进来,HTTP请求进来,框架去解析HTTP请求去构造Request对象,根据URL寻找Servlet去调用Servlet就可以了,这个过程Servlet是一个接口,而我们的应用程序就是要实现这个接口,最后把我们的应用程序和Tomcat框架部署在一起的时候,Tomcat就可以将HTTP端口发过来的数据流构建成了Http请求,来调用我们实现的Servlet对象,这就是框架,框架来调用我们,而我们不用去调用框架,而框架主导了系统软件的整个结构,整个流程,而我们的代码就是在框架里面实现的一个细枝末节。它倒转了层次的依赖关系,高层模块Tomcat,不在依赖低层模块,不再依赖我们的代,它也不应该依赖我们的代码,也不可能依赖我们的代码,它依赖一个抽象就可以设计出来高层模块,就可以设计出来框架,而我们的代码实现这个接口,就可以被框架调用。这个就是高层设计一个抽象出来,然后我们来实现它,然后被调用,就等于被高层模块调用,整个依赖关系被倒置了。



架构师应该能够理解框架,能够理解框架背后设计的原理,才能够用好框架,才能够设计好的框架出来。



综上所述,依赖倒置原则就是高层设计抽象,依赖抽象,低层实现抽象;而框架设计的核心就是满足这个原则;而为什么叫好莱坞原则,那是因为和好莱坞的游戏规则一样。高层定义好了,下面照着办,自己无法控制,只能被动接受。框架设计好了规则,代码满足它的要求,就会被框架调用。



作业二:

类图



说明:

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

  2. IRemoteCache接口的方法暴露给远程系统调用,包含的方法有reBuild,从而实现接口隔离,不应该强迫客户端程序依赖它们不需要的方法

  3. CacheImpl还是实现全部的方法



用户头像

晴空万里

关注

还未添加个人签名 2018.07.18 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
原则分析的很全面
2020 年 11 月 08 日 22:59
回复
没有更多了
第二周作业