让我们拥抱变化的原则
前言
前一章中我们进了里氏代换原则和开闭原则,让我们知道如何对类的结构进行组织的原则及设计的时候应该要符合扩展优先修改关闭,前面两个原则是定了面向对象设计的基调,但是如何进行扩展,如何在产生变化的时候通过进行行为的改变呢,其实并没有给出什么方法论和指导,那么这次所讲的接口隔离原则和依赖倒置原则,就指出了如何进行扩展如何通过扩展行为,如果整个设计结构不变的情况下实现行为改变,实现方式的改变有当对象或者角色产生变化时,如何处理的方法论。所以我认为这两个原则更像是方法论。
接口隔离原则(ISP)
https://baike.baidu.com/item/%E6%8E%A5%E5%8F%A3%E9%9A%94%E7%A6%BB%E5%8E%9F%E5%88%99
多个专门的接口总是要比单一的接口要好,一个类的依赖应该建立有最小的接口上,接口代表的是角色,不要强行将不相关的接口拼装在一起,相互污染。这个原则包含了如下三方面。
- 接口的实现来讲,一个类只能最好只要实现一个接口,不要强行的实现多接口,避免一个实现的了多个角色。
- 接口的引用来讲,引用的一定是接口,而且是最小的接口,应该避免为了同时引用两个角色的时候将两个接口拼装成另外一个接口,也要避免为了引用多个角色的时候直接引用一个实现了多接口的实现类。
- 隔离变化来讲,类引用的一定是接口,设计上我们不用考虑怎么实现,应该通过接口来定义出各个角色的边界,也就是方法的数量,产生变化需要重新编写实现方式时一定是重新实现替换一个新的实现,而不是在原来的实现里进行更改,这样和符合开闭原则。
依赖倒置原则(DIP)
https://baike.baidu.com/item/%E4%BE%9D%E8%B5%96%E5%80%92%E7%BD%AE%E5%8E%9F%E5%88%99
依赖倒置原则是一个告诉我们当我们要给一个实现加入一项功能时相互依赖时的引用原则,也是在做重构中一项很重要的解耦的方法论,包含如下两个方面:
- 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象
- 抽象不应该依赖于具体的实现,具体实现应该依赖于抽象
那么在我们开发过程中主要体现在如下方面
- 引用时一定是引用接口或者抽象类
- 依赖倒置接口的定义时,应该充分考虑到接口的边界,这就是上述据说的接口隔离原则来确认的
- 倒置的功能强调于依赖于抽象,而抽象一定是定义一个是有边界的,如何定义好抽象将依赖于,后面的迪米特法则和单一职责原则
- 如何定义依赖倒置的抽象类时,我们用抽象类的目的不是为了引用重用抽象类的方法,而是他的逻辑,在抽象类里只能定义他的一套抽象实现逻辑,而不是为了子类可以重用抽象类的方法,避免这样的使用带来涟漪效应。
综上所述,依赖倒置他是强调了高层次引用的重要性,但是在很多书里没有讲述这些高层次的类(抽象)应该怎么定义,所以总结了一下,希望对大家有所帮助。《在java与模式》这本书中这个原则的体现贯穿始终,特别是行为模式的引用时,全是基于这个原则,改变行为是通过抽象的实现来改变的,而不是抽象层的改变得到的,这个时候就要想到用依赖倒置原则去审视一下你的设计。
后续