依赖倒置原则

    1. 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)
    2. 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)

    【理解】
    第一种方式:分解的思维

    1. MainForm依赖于Line、Rect,这个依赖关系是不稳定的
    2. MainForm是高层模块,高层模块是相对稳定的
    3. Line、Rect是低层模块,低层模块是容易变化的
    4. 稳定的东西(MainForm)依赖于不稳定的东西(Line、Rect),那么稳定的东西(MainForm)都变得不稳定了

      1. MainForm --> Line
      2. --> Rect

      第二种方式:抽象的思维

    5. Shape就是句子中所说的抽象

    6. Shape是稳定的,MainForm也是稳定的,MainForm依赖于Shape是没有问题的
    7. Line、Rect是容易变化的,Shape是稳定的,Line、Rect依赖Shape是没有问题的,变化依赖于稳定。如果需求一旦变化,则修改Line、Rect这一测就好了
    8. Shape中不能使用到子类Line、Rect的东西,即Shape不能依赖于子类,Shape不能依赖于实现细节。为什么?因为抽象应该是稳定的,不能依赖于实现细节,因为实现细节是容易变化的。
      1. MainForm --> Shape <-- Line
      2. <-- Rect
      如此,我们就实现了隔离变化,变化即是Line、Rect,它们被隔离起来了,放在了一边。而上层的MainForm、Shape不会受到影响。

    依赖倒置又是什么意思?

    1. 第一种方式中,Line、Rect被MainForm依赖
    2. 第二种方式中,Line、Rect没有被人依赖了,反而是它们 与Shape

    如此,被别人依赖变成依赖别人,被动变成主动,就是依赖倒置了。

    1. MainForm --> Line
    2. --> Rect
    3. MainForm --> Shape <-- Line
    4. <-- Rect

    【疑问】如果违背了依赖倒置原则,该怎么办?
    提出抽象类。将依赖进行倒置。形成第二种方式。