架构师训练营第二周作业
作业一:
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则的英文描述为:
High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.
在程序的调用过程中,调用者属于High-level modules,被调用者属于Low-level modules,也就是说在常规的Spring分层开发中,Controller调用Service,Service调用DAO都是不符合这一条原则的,因为高层模块已经依赖到了低层模块。要想符合这条原则,则应该把Controller中需要调用的service方法都抽象成一个新的接口A,并且接口A应该放在跟Controller同一level,具体的Service层需要实现这个接口。通过这样的方式,调用者Controller和被调用者Service解耦,两者都依赖于新接口A。同时这个新的抽象接口A没有依赖任何具体的实现, 反之,具体的实现Service类需要依赖这个抽象接口A。
在业务开发中,可能本人接触到的都是简单的项目,还没有看到符合依赖倒置原则的代码。不过在框架开发中,这一条原则有着极其重要的应用。比如在Spring开发中,你需要实现一个endpoint,只需创建一个Controller,加一个方法就可以做到。为什么呢?为什么不需要调用框架的类或者方法呢?这是因为框架和你写的类都依赖同一个抽象(通过annotation),框架只需要依赖于框架本身的抽象类,就可以调用到你实现的方法。通过这种方式,你在开发中不需要调用任何框架方法,反之,框架会调用你的方法,这也就是为什么叫做好莱坞原则的原因:You don't call me, I will call you!
作业二:
请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
Spring框架中,是通过依赖注入来实现的。假设我们又一个spring的Controller,我们把依赖的内容都抽象成一个接口A,然后具体的Service类实现了接口, 那么Controller只依赖了接口A,他是如何得到接口A的具体实现类的呢?Spring的做法是依赖注入,通过annotation,发现Controller依赖接口A,则会去寻找系统中是不是有接口A的实现类,有则直接注入到Controller的属性中。
作业三:
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
评论