依赖倒置及 Cache 重构设计
Author: Jessie
Date:2020-6-16
作业一:
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则(DIP):Dependency Inversion Principle
l 高层模块不能依赖低层模块,而是大家都依赖于于抽象。
l 抽象不能依赖实现,而是实现依赖抽象。
依赖倒置的关键:面向接口的编程。不是调用,通过定义接口来实现。这个原则下高层模块就很容易被重用。
传统的过程化程序设计的依赖关系结构,策略依赖于细节的;
面向对象的程序设计倒置了依赖关系的结构,使得细节和策略都依赖于抽象,并且由客户端程序拥有服务接口。
按照依赖倒置原则,接口的所有权是被倒置的。通俗说就是,高层模块不依赖底层模块,而是都是依赖抽象接口,高层模块拥有这个接口,底层模块实现接口。
不是高层模块依赖底层模块的接口,而是底层模块依赖高层模块的接口,从而实现依赖关系的倒置。这样,底层模块的改动不会影响高层模块,高层模块的复用也不会依赖底层模块。
所以依赖倒置原则也被称为好莱坞原则:Dont't call me, I will call you. 框架就是利用依赖倒置原则实现的一类软件。Tomcat、Spring 都是基于这个原则设计出来的,应用程序不需要调用Tomcat或者Spring这样的框架,而是框架调用应用程序。而实现这一特性的前提就是应用程序必须实现框架的接口规范。
作业二:
请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
Spring框架,它的核心就是IoC容器。利用了控制反转的思想以及依赖注入的实现方式。为了减低计算机代码之间的耦合度,其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。就是由spring来负责控制对象的生命周期和对象间的关系。
调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。
如图:原来的直接调用强依赖(主动new 对象),由于引入IoC容器后, A、B、C、D这4个对象没有了耦合关系,齿全部对象的控制权全部上缴给“第三方”IOC容器。IoC也就很好体现了好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
依赖注入作为控制反转的一种实现方式,将实例变量传入到一个对象中去。
通过loC容器通过反转来创建对象,并将依赖对象注入到对象中。反转的前提是使用XML文件将需要注入的对象向配置在文件中,在程序中通过ClassPathXmlApplicationContext类来创建一个容器,通过容器的**.getBean()方法来创建对象。通过反射,和XML中配置对象的Id或name属性**来创建对象。
作业三:
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
作业三提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。
设计如下:利用两个接口将cache使用和rebuild的接口分离。
版权声明: 本文为 InfoQ 作者【架构5班杨娟Jessie】的原创文章。
原文链接:【http://xie.infoq.cn/article/817b04e357b50da2a0c91b12e】。文章转载请联系作者。
评论