依赖倒置原则
- 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)
- 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)
【理解】
第一种方式:分解的思维
- MainForm依赖于Line、Rect,这个依赖关系是不稳定的
- MainForm是高层模块,高层模块是相对稳定的
- Line、Rect是低层模块,低层模块是容易变化的
稳定的东西(MainForm)依赖于不稳定的东西(Line、Rect),那么稳定的东西(MainForm)都变得不稳定了
MainForm --> Line
--> Rect
第二种方式:抽象的思维
Shape就是句子中所说的抽象
- Shape是稳定的,MainForm也是稳定的,MainForm依赖于Shape是没有问题的
- Line、Rect是容易变化的,Shape是稳定的,Line、Rect依赖Shape是没有问题的,变化依赖于稳定。如果需求一旦变化,则修改Line、Rect这一测就好了
- Shape中不能使用到子类Line、Rect的东西,即Shape不能依赖于子类,Shape不能依赖于实现细节。为什么?因为抽象应该是稳定的,不能依赖于实现细节,因为实现细节是容易变化的。
如此,我们就实现了隔离变化,变化即是Line、Rect,它们被隔离起来了,放在了一边。而上层的MainForm、Shape不会受到影响。MainForm --> Shape <-- Line
<-- Rect
依赖倒置又是什么意思?
- 第一种方式中,Line、Rect被MainForm依赖
- 第二种方式中,Line、Rect没有被人依赖了,反而是它们 与Shape
如此,被别人依赖变成依赖别人,被动变成主动,就是依赖倒置了。
MainForm --> Line
--> Rect
MainForm --> Shape <-- Line
<-- Rect
【疑问】如果违背了依赖倒置原则,该怎么办?
提出抽象类。将依赖进行倒置。形成第二种方式。