训练营第二周作业

用户头像
毛叫
关注
发布于: 2020 年 06 月 17 日



作业一:

  • 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

低层模块进行具体逻辑的实现,高层模块调用低层模块,这是非常自然的,在实际代码编写中就会很自然的使得高层模块依赖低层模块.

有一个说法很有意思,变化将向依赖的反方向传递. 如果低层模块发生了变化,将会沿着依赖的反方向传递到高层.从而高层模块也发生相应的变化.除此之外,高层依赖低层,高层的可服用性也会降低.

依赖倒置有两个原则

1.高层不直接依赖低层,低层和高层应该都依赖与抽象

2.抽象不依赖于细节,细节应该以来于抽象.

第二点我觉得特别需要关注一下,有的时候,我们所谓的抽象其实是总结, 先是实现了一大堆的细节后,发现代码很多,有很多可以复用的地方,然后将其抽出来, 也许称其为总结会更合适. 总结的不好,可能细节一变,抽象又得变.

使用依赖倒置原则后, 高层就不直接依赖低层的实现了,而是高层根据需要,定义一堆抽象,来规范低层模块的行为,这样,只要抽象不变,底层的变化就无法传递到高层.

好莱坞原则---"don‘t call us, we‘ll call you". 在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。这种原则正好就是依赖倒置的体现.



作业二:

  • 请描述一个你熟悉的框架,是如何实现依赖倒置原则的。

Spring中Bean的依赖注入就是依赖倒置的一种实现. 有个经典的问题,就是IOC和DI的区别,IOC控制反转,DI依赖注入是IOC的一种实现或者说应用.

在Spring中,我们只需要通过配置,就不需要自己手动进行Bean的实例化, 通过配置,就能让Spring实现各种Bean之间的依赖关系. 实现原理粗略的讲就是Spring中有个Bean的容器(一个大Map), 通过配置的元信息构建BeanDefinition, 实例化后就放入这个大Map中,当碰到依赖的时候,就从这个Map中取出依赖的Bean. 解决循环依赖则光有一个Map就办不到了

/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);

/** Cache of singleton factories: bean name --> ObjectFactory */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);

/** Cache of early singleton objects: bean name --> bean instance */
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);

Spring中用这三个缓存来解决循环依赖.可以看下面这篇文章

https://blog.csdn.net/u010853261/article/details/77940767

作业三:

  • 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。





用户头像

毛叫

关注

还未添加个人签名 2018.12.25 加入

还未添加个人简介

评论

发布
暂无评论
训练营第二周作业