依赖倒置原则,就是从客户端代码调用框架代码,变成框架调用客户端代码。框架来定义接口,客户端来实现。
(1)高层模块不应该依赖底层模块,二者都应该依赖抽象
(2)抽象不应该依赖细节,细节应该依赖抽象
(3)依赖倒置原则的中心思想是面向接口编程
(4)依赖倒置原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定的多
好莱坞原则:别打电话给我,有事我会打电话给你
好莱坞原则用在系统的高层组件和低层组件之间,低层组件将自己挂钩到系统上,高层组件会来决定什么时候和如何调用低层组件。高层组件对待低层组件的方式是,别来调用我,我会调用你。
好莱坞原则和依赖倒置原则之间还是有所区别的。
依赖倒置原则更多是说,我们应该面向接口编程;好莱坞原则是说,低层组件将自己挂钩到系统上,由系统来主动调用。
如图是tomcat处理web请求的流程图,请求会经过 connector,coyote,engine,host,context,Servlet,层层传递最终传递到我们的应用程序里面来。我们只需要把程序发布成war包放在指定的目录下即可使用。
我们的应用程序就是低层组件,底层组件没有去调用tomcat的什么类,而是框架层主动调用应用程序来处理。
这就体现了依赖倒置原则,高层组件来定义接口和规范,底层组件来实现。
如图,希望 reBuild 方法只是给框架调用,客户端不应该调用 reBuild 类,该如何设计
思路如下:
caache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。
那么提供给用户使用的就是 Cache 类,而 CacheManager 类给框架使用。