面向对象设计原则之 -- 依赖倒置
一、依赖倒置详解
1、什么是依赖倒置
传统的设计办法倾向于使高层的模块依赖于低层次的模块;抽象层次依赖于具体层次。依赖倒置就是把这个依赖关系倒转过来,这就是“依赖倒置”原则。
以抽象方式耦合是依赖倒置原则的关键。由于一个抽象耦合关系总要涉及具体类从抽象类继承,并且需要保证在任何引用到基类的地方可以改换成其他子类。总之:要依赖于抽象,不要依赖于具体。
2、️为什么有时候依赖倒置原则又被称为好莱坞原则?
好莱坞原则简称: "Don't call us, we'll call you!"。意思是,好莱坞的经纪人们不希望你去联系他们,而是他们会在需要的时候来联系你。也就是说,所有的组件都是被动的,所有的组件初始化和调用都由高层负责。组件的调用被高层管理。好莱坞原则强调高层对低层的主动作用,即低层应该只管好自己的工作(具体实现),而高层自有它自己的工作,在不需要到某个低层的时候,高层并不会调用到这个具体低层,低层永远不需要向高层作出表示,说它需要被调用。
二、依赖倒置的使用
采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定,降低并行开发引起的风险,提高代码的可读性和可维护性。下面举例说明:
通常,我们使用这种方式创建多个学生对象。但是,在工作过程中也有如下使用的同事:
哪里出错了吗?没有!功能测试、自测都通过。这两行代码的区别就是,前者使用抽象类型(List)作为类型,而前者使用具体类(ArrayList)作为变量的类型。后者的好处是,在将ArrayList类型换成Vector类型时,需要改动很少:
这样一来,程序具有更好的灵活性,因为除去调用构造器的一行代码之外,其余部分根本觉察不到有什么变化。只要一个被引用的对象存在抽象类型,就应当在任何使用的地方引用此对象的抽象类型,包括变量的声明,方法的返回值,成员变量的声明等等。
三、用接口隔离原则优化 Cache 类的设计
需求:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。
应用接口隔离原则,先将reBuild(Config conf)方法放到另外一个接口中去,从而形成两个接口。实现了同时实现这两个接口,类图如下:
MyCache类分别实现了Cache接口和CacheRebuilder接口。缓存工厂MyCacheFactory分别提供生成MyCache示例的方法,但是请注意,两个方法返回值是不同的,分别返回各自的接口类型,这样从而达到“隔离”的效果。欢迎批评与指正。
评论