架构师训练营 - 第二周作业
作业一:
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则
依赖倒置原则的官方解释:
高层模块不要依赖底层模块,高层模块和底层模块应该通过抽象来互相依赖,抽象不依赖具体实现,具体实现应该依赖抽象。
具体在代码中表现:
假如由高到低层TestController->TestService->TestDao,按照依赖倒置原则改造,TestController定义抽象接口ITestService,TestController依赖ITestService接口(具体实现依赖抽象),TestService实现接口ITestService定义的方法,TestService定义Dao层接口ITestDao,TestService依赖ITestDao,TestDao实现ITestDao接口定义的方法。
关于为什么是叫“倒置”
高层模块依赖底层模块,变成,高层模块依赖底层模块的抽象接口,底层模块实现底层模块的接口,依赖具体变成依赖接口就叫“倒置”了么。
一个软件的高层应用是可能会发生变化的,因为它对应的是客户不断变化的需求,一旦高层变化,底层的实现逻辑也可能要跟着不断变化,因为高层增加了新的业务需求,底层就需要提供相对应的实现。假如高层依赖底层的接口,那么这个底层接口应该由谁维护呢?如果放在底层会怎样,也就是底层接口和底层实现都放在底层,可是底层并不关心高层的具体业务逻辑,现在接口放在低层维护,就应该由低层的开发人员负责体现需求的接口的“变更”,如此就会出现这样的情况,即负责高层实现的开发人员,他们拥有需求,但无法定义描述需求的接口;负责底层的开发人员,他们不管需求,只应提供具体实现,却要维护和应用需求有关的接口。如果把接口放在高层维护,也就是由高层来定义底层接口,底层根据高层定义的接口来实现对应的服务,那么这就不会相互矛盾了,底层抽象接口由底层维护变成高层维护(归属变更),高层依赖底层变成高层依赖自己(的抽象接口),依赖的归属倒置了,这应该才是“倒置”的真正含义。
为什么有时候依赖倒置原则又被称为好莱坞原则
好莱坞原则的定义,不要给我们打电话,我们会给你打电话。
好莱坞不允许演员主动找他们(即使主动投递了简历也没用),如果他们足够优秀,好莱坞会主动找上门。
演员要应聘一般需要主动投递简历,而在好莱坞,他们只能被动的接收,从主动变成被动,跟依赖倒置原则的底层抽象接口由底层维护变成高层维护有相似之处。
作业二:
请描述一个你熟悉的框架,是如何实现依赖倒置原则的
依赖倒置原则是框架基本上都会遵循的一个设计原则。
比如spring,只要我们使用了@service和@autowrited等等相关注解,spring就会帮我们在容器中注册bean,且建立类与类之间的依赖关系,spring调用我们,属于高层模块,我们需要添加或依赖spring约定好的注解才能应用到spring提供的功能,
如果没有使用spring框架或其它框架,那我们就需要在调用方主动new被调用方对象,从主动new对象,变成被动生成对象和注入依赖,方式变了,前提是必须要遵嘱spring约定好的规范。
作业三:
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
作业三提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法
类图如下:
说明:
ICacheApp接口定义给应用程序调用的方法,
ICacheRemote接口定义供远程调用的方法,
RedisCache实现ICacheApp接口和ICacheRemote接口定义的对Redis的操作逻辑,
NativeCache实现ICacheApp接口和ICacheRemote接口定义的对本地缓存的操作逻辑,主要便于本地单元测试,
ClientApp应用程序依赖注入ICacheApp接口,实现对Cache的操作,
CacheRemoteController暴露rest接口接收远程调用请求。
评论