zoukankan      html  css  js  c++  java
  • 《设计模式之禅》学习笔记(三)

    第3章 依赖倒置原则

    依赖倒置原则(Dependence Inversion Principle, DIP)的定义:

    High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.

    翻译过来,有三重含义:

    • 高层模块不应该依赖底层模块,两者都应该依赖其抽象。
    • 抽象不应该依赖细节。
    • 细节应该依赖抽象。

    更加精髓的定义就是"面向接口编程"——面向对象设计的精髓之一。

           

    依赖倒置原则在Java语言中的表现就是:

    • 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
    • 接口或抽象类不依赖于实现类。
    • 实现类依赖与接口或抽象类。

           

    采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并发开发引起的风险,提高代码的可读性和可维护性。

           

    依赖是可以传递的。只要做到抽象依赖,即使是多层的依赖传递也无所畏惧。

           

    对象的依赖关系又三种方式来传递:

    1. 构造函数传递依赖对象

      public interface IDriver {

      void drive();

      }

      public class Driver implements IDriver {

      private ICar car;

      public Driver(ICar car) {

      this.car = car;

      }

      public void drive() {

      car.run();

      }

      }

    2. Setter方法传递依赖对象

      public interface IDriver {

      void setCar(ICar car);

      void drive();

      }

      public class Driver implements IDriver {

      private ICar car;

      public setCar(ICar car) {

      this.car = car;

      }

      public void drive() {

      car.run();

      }

      }

    3. 接口声明依赖对象

      public interface ICar {

      public void run();

      }

      public class Benz implements ICar {

      public void run() {

      System.out.println("奔驰汽车开始运行...");

      }

      }

      public class BMW implements ICar {

      public void run() {

      System.out.println("宝马汽车开始运行...");

      }

      }

      public interface IDriver {

      public void driver(ICar car);

      }

      public class Driver implements IDriver {

      public void driver(ICar car) {

      car.run();

      }

      public static void main(String[] args) {

      IDriver zhangSan = new Driver();

      ICar benz = new Benz();

      zhangSan.driver(benz);

      ICar bmw = new BMW();

      zhangSan.driver(bmw);

      }

      }

           

    最佳实践:

    • 每个类尽量都有接口或抽象类,或者两者都具备。接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的世界对父类进行细化。
    • 变量的表面类型尽量是接口或者是抽象类。
    • 任何类都不应该从具体类派生。
    • 尽量不要覆写(Override)基类的方法。
    • 结合里氏替换原则使用。

           

    "面向接口编程"是依赖倒置原则的核心。

           

    一个项目的终极目标,是投产上线和盈利。技术只是实现目的的工具。

  • 相关阅读:
    Top 10 Free IT Certification Training Resources
    在线学编程!十大IT在线教育网站推荐
    2016年国际十大科技新闻解读
    2016上半年度私有云提供商排行榜 :华为位居第一
    12 Top Open Source Data Analytics Apps
    Careers/Staffing Index
    top 9 Cloud Computing Failures
    344. Reverse String
    283. Move Zeroes
    DataContract with Json.Net
  • 原文地址:https://www.cnblogs.com/qwertWZ/p/2835887.html
Copyright © 2011-2022 走看看