2020-06-13- 第二周作业
1 作业一
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置指的是让底层模块去依赖高层模块的抽象接口,即让底层模块去实现高层模块的抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
比如现在有一个冰淇淋商店正在卖不同口味的冰淇淋,比如草莓口味、牛奶口味、咖啡口味等等。按照正常的逻辑设计如下图所示,冰淇淋店会依赖各种口味的冰淇淋。其中冰淇淋店属于高层模块,其他各种口味冰淇淋为底层模块。
根据依赖倒置原则,处在底层的各种口味的冰淇淋应该依赖高层的冰淇淋商店。所以倒置的应该是依赖关系,所以,冰淇淋商店抽象出一个接口,底层去实现这个接口。具体类图如下图。
好莱坞原则:Don’t call me, I’ll call you. 翻译过来就是不要打电话给我们,我们会给你打电话。当一个演员有足够的实力的时候,他不必去主动联系好莱坞,好莱坞就会主动找上门来。即演员只需要做好自己的本职工作,不需要过度关注好莱坞。
好莱坞原则的思想是让服务提供者主动通知消费者,而不是让消费者调用服务提供者。比如巴士司机提供载客服务,司机是服务提供者,乘客是消费者。与其让乘客一遍又一遍地问司机到站了没有,倒不如让司机对其进行通知。所以好莱坞原则的核心是用通知代替轮询。
而且这种机制使得原来的依赖关系(乘客依赖司机)抽象到乘客依赖司机的到站通知接口,这样使得司机不必关心每个乘客需要到哪些地方,仅关心到站就通知乘客即可。
这种思想实际上就是依赖倒置,即底层仅关心高层提供的接口,去做具体的实现,不需要主动调用高层。高层则通过接口调用底层实现,这样会使得底层实现与高层之间解耦。而底层模块之间也需要注重解耦的必要。
2 作业二
请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
Spring 框架中的 IoC 便是基于好莱坞原则进行设计的。
控制反转(IoC,Inversion of Control),就是本来需要为对象添加依赖关系的地方,使用一个对象容器统一进行管理,通过注解、反射等技术将对象的依赖注入的一种技术手段。
比如现有一个初始化车辆的类图,如下图所示,车辆依赖车身,车身依赖底盘,底盘依赖轮胎。因为按照正常逻辑,初始化车辆就要实例化车身对象,车身对象实例化底盘对象,底盘对象实例化轮胎对象。这样各个层次模块之间的耦合性比较高,而一旦底层做了修改,比如修改了构造方法,那么高层模块的实例化部分也需要随着更改。这样依赖就导致了牵一发而动全身的被动更改。
根据 Spring 的 IoC 控制反转逻辑,我们可以按照依赖倒置原则,在高层抽象出一个接口用于底层实现,如下图。
而车辆高层不需要依赖车身,车身也不需要依赖底盘,底盘也不需要依赖轮胎。当需要对应的底层实现时,IoC 容器里面实例化好的底层对象,就会被注入到指定的高层对象中。以上就是 IoC 容器实现的依赖倒置原则。
3 作业三
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
作业三提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。
答:使用如下类图进行设计,即将 Cache 中四个方法分成两个接口,并且使 Cache 实现这两个接口,CacheOperation 和 CacheConfigure,这两个接口分别用于应用程序和远程调用。这样应用程序就不会看到 reBuild 方法,保证了 Cache 类的安全性。
评论