架构师训练营 -week2 命题作业
作业一:请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
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、抽象不应该依赖于细节,细节应该依赖于抽象
在SpringMVC框架中,模块从上到下依次是Controller层--->Service层--->DAO层,按照依赖倒置原则的要求,上层不能依赖底层,那么是不是Controller就不能依赖Service呢?这不是与我们平时使用矛盾吗?其实不是,后边一句注意是他们都应该依赖于抽象,也就是Controller依赖的并不是Service的实现,而是Service的抽象,也就是接口。Controller定义了依赖的抽象,并不关心依赖的具体实现,但不是说Controller什么都不依赖。这也提现了第二点:抽象接口不依赖于具体细节,细节应该依赖于抽象,比如说Service实现类要实现Service接口抽象。
好莱坞原则:don’t call me ,i will call you
在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。
在软件设计中,高层模块依赖底层模块就像演艺公司依赖演员,但是底层模块对高层模块来讲不应该是强制被依赖的,也就是说当高层模块需要时进行对底层模块的调用,在框架设计中,高层模块对准备好的底层模块比如bean随时可以进行调用,而不是让底层的bean来主动投递到高层模块处使用。
作业二:请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
比如Spring框架中的ioc是依赖倒置原则的实现,ioc的意思是控制翻转,Spring容器启动时会进行bena的初始化,这跟传统编码中需要时直接new的方式不同,这里的bean不再由客户端去控制而是交给容器或者框架去管理。这也是依赖倒置的一个体现------高层模块不依赖于底层模块,比如bean的创建不再受到客户端的限制,而是由容器(高层)来管理bean。还有就是上边提到的SpringMVC的三层架构依赖方式。
在AOP面向切面编程的思想中,其实也是调用方依赖的是底层或者接受方的接口而不是具体实现。这样以来具体实现怎么样跟上层其实没有直接关联,对系统解耦提供了帮助。
作业三:请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
作业三提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。
类图如下:
版权声明: 本文为 InfoQ 作者【J.Spring】的原创文章。
原文链接:【http://xie.infoq.cn/article/22c3ee3bff1ddf89313fd11a3】。文章转载请联系作者。
评论