只记录自己的理解,对于网上通用的解释不做记录
首先是六个面向对象原则:下面是我自己的分类:根据实现方式分为两类,一类是跟多态有直接关系的、一类是无关的
- 单一职责、接口隔离
- 开闭、里氏替换、依赖倒置、迪米特
- 对于开闭原则的理解:在要修改的时候,应该采用扩展的方式,不应该这样理解:对扩展开放、对修改关闭
// 面向接口编程,几乎能对应到上面四个原则的实现
Interface inf = new Class(); //或者延迟初始化,使用外部设置进来的值
inf.xxx();
// 依赖倒置原则(高层模块不应依赖于低层模块,两者应该依赖于抽象;抽象不不应该依赖于实现,实现应该依赖于抽象)
高层模块 -> 接口 <- 底层模块
其次是DIP、IOC(DI是IOC的一种实现方式):分别是:依赖倒置、控制反转、依赖注入
DIP:同上面的依赖倒置原则
-
IOC:有三个东西:依赖方、被依赖方、依赖控制器
- 一般使用DI方式实现IOC。如下示例可以看出:没有基于IOC方式,card依赖由ATM本身控制,而实现了IOC之后,card依赖就不再由ATM控制了,而是由第三方来控制(第三方通过调用
setCard()
决定给ATM注入什么样的依赖)- DI一般可以通过构造函数、或者是抽出一个接口来,对依赖进行控制,还可以由IOC容器实现
// 示例:ATM依赖Card,没有基于IOC class ATM { private var card: Card = Card() } // 基于IOC class ATM : IController { private var card: Card? = null override fun setCard(card: Card) { this.card = card } }
- 一般使用DI方式实现IOC。如下示例可以看出:没有基于IOC方式,card依赖由ATM本身控制,而实现了IOC之后,card依赖就不再由ATM控制了,而是由第三方来控制(第三方通过调用