zoukankan      html  css  js  c++  java
  • 抽象不应该依赖于具体,具体应该依赖于抽象。 要针对接口编程,而不是针对实现编程。

    图二
    看图 2中这个简单的类图。这儿有一个“AutoSystem”类,它包含一个“ICar”接口。这个“AutoSystem”类根本不依赖于“FordCar”和“HondaCar”。所以,依赖关系被“倒置”了:“AutoSystem”模块依赖于抽象,那些具体的汽车操作也依赖于相同的抽象。
    于是可以添加ICar
     
     
     
     
     
     
    public interface ICar
    {
    void Run();
    void Turn();
    void Stop();
    }
    public class BmwCar:ICar
    {
    public void Run()
    {
    Console.WriteLine("宝马开始启动了");
    }
    public void Turn()
    {
    Console.WriteLine("宝马开始转弯了");
    }
    public void Stop()
    {
    Console.WriteLine("宝马开始停车了");
    }
    }
    public class FordCar:ICar
    {
    publicvoidRun()
    {
    Console.WriteLine("福特开始启动了");
    }
    public void Turn()
    {
    Console.WriteLine("福特开始转弯了");
    }
    public void Stop()
    {
    Console.WriteLine("福特开始停车了");
    }
    }
    public class HondaCar:ICar
    {
    publicvoidRun()
    {
    Console.WriteLine("本田开始启动了");
    }
    public void Turn()
    {
    Console.WriteLine("本田开始转弯了");
    }
    public void Stop()
    {
    Console.WriteLine("本田开始停车了");
    }
    }
    public class AutoSystem
    {
    private ICar icar;
    public AutoSystem(ICar icar)
    {
    this.icar=icar;
    }
    private void RunCar()
    {
    icar.Run();
    }
    private void TurnCar()
    {
    icar.Turn();
    }
    private void StopCar()
    {
    icar.Stop();
    }
    }
     
     
    现在AutoSystem系统依赖于ICar 这个抽象,而与具体的实现细节HondaCar、FordCar、BmwCar无关,所以实现细节的变化不会影响AutoSystem。对于实现细节只要实现ICar 即可,即实现细节依赖于ICar 抽象。
    综上:
    一个应用中的重要策略决定及业务模型正是在这些高层的模块中。也正是这些模型包含着应用的特性。但是,当这些模块依赖于低层模块时,低层模块的修改将会直接影响到它们,迫使它们也去改变。这种境况是荒谬的。应该是处于高层的模块去迫使那些低层的模块发生改变。应该是处于高层的模块优先于低层的模块。无论如何高层的模块也不应依赖于低层的模块。而且,我们想能够复用的是高层的模块。通过子程序库的形式,我们已经可以很好地复用低层的模块了。当高层的模块依赖于低层的模块时,这些高层模块就很难在不同的环境中复用。但是,当那些高层模块独立于低层模块时,它们就能很简单地被复用了。这正是位于框架设计的最核心之处的原则。
    总结:依赖倒置原则
    A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
    B.抽象不应该依赖于具体,具体应该依赖于抽象。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    https://baike.sogou.com/v123729.htm?fromTitle=设计模式

    抽象不应该依赖于细节,细节应当依赖于抽象。

    要针对接口编程,而不是针对实现编程。

    传递参数,或者在组合聚合关系中,尽量引用层次高的类。

    主要是在构造对象时可以动态的创建各种具体对象,当然如果一些具体类比较稳定,就不必在弄一个抽象类做它的父类,这样有画蛇添足的感觉。

  • 相关阅读:
    JavaScript对原始数据类型的拆装箱操作
    Javascript继承(原始写法,非es6 class)
    动态作用域与词法作用域
    自行车的保养
    探索JS引擎工作原理 (转)
    C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库
    C语言提高 (6) 第六天 文件(续) 链表的操作
    C语言提高 (5) 第五天 结构体,结构体对齐 文件
    C语言提高 (4) 第四天 数组与数组作为参数时的数组指针
    C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9706918.html
Copyright © 2011-2022 走看看