第一章:面向对象的六大原则
1. 单一职责
每一个类的类名需要概述其核心意义,如Cache类,StringUtils类。因此每个类都应该只有它单一的作用元素。(这个原则最简单也最复杂,什么是类的职责,以及怎么划分类的职责)
2. 开闭原则
对扩展该类的开放,对修改该类的封闭。
如在程序中都会用到图像加载类,图像加载的框架有很多种,Picasso、Glide、Imageloader等。当我们切换图片加载框架时,应当考虑只切换框架的实现方法,不更改其使用的地方。
3. 依赖倒置
- 高层次不应该依赖低层次模块,两者都应该依赖抽象
- 抽象不应该依赖细节
- 细节不应该依赖抽象
在java语言中的表现就是:模块间的依赖通过抽象产生,实现类之间不发生直接的依赖关系,其依赖关系是通过抽象类或者接口产生。可以概括为面向接口编程,或者面向对象编程。
如okhttp中的拦截器接口,用户可以按自己的要求实现该接口的方法,okhttp并不依赖其拦截器的具体实现,只依赖拦截器的抽象接口。
4. 里氏替换
里氏替换原则的核心是抽象、但是抽象又依赖于继承的特性。
拿Android源码来说,源码中的TextView、ImageView都继承View的抽象接口。所以任何继承自View的类都可以设置给show()方法。
继承的优点:
-
代码重用,减少类的创建成本,每个类都拥有父类的方法和属性
-
子类和父类基本相似,但又与父类有所区别
-
提高代码的可读性
缺点:
-
继承具有侵入性,只要继承就必须拥有父类的所有属性和方法
-
可能造成代码冗余、灵活性降低、因为子类必须拥有父类的属性和方法
5. 接口隔离
接口隔离原则英文全称是Interface Segergation Principles,缩写是ISP。ISO的定义是:客户端不应该依赖它不需要的接口。另一种定义是:类间的依赖关系应该建立在最小的接口上。
如之前提到的图片加载框架,我们使用时只依赖于抽象方法,去调用图片的加载、缓存等方法。但我们并不需要知道加载或缓存方法的具体实现
6. 迪米特原则
迪米特原则有一个英文解释是Only talk to your immedate friends(“只与直接的朋友通信”),每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,如组合、聚合、依赖等。
如图像加载类的缓存实现,用户不用知道缓存方法的具体逻辑,当底层改动了缓存方法时,用户也是无感知的。