Java设计原则—依赖倒置原则(转)

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

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

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

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

依赖倒置原则实际上就是要求“面向接口编程”。

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

例:

司机接口

public interface IDriver {

    public void driver(ICar car);

}

司机实现类

public class Driver implements IDriver {

    public void driver(ICar car) {
        car.run();
    }

}

汽车接口

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 class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        IDriver zhangSan = new Driver();
        ICar benz = new Benz();
        zhangSan.driver(benz);
    }

}

依赖的三种写法

只要做到抽象依赖,即使是多层的依赖传递也无所谓惧!

  • 构造函数传递依赖对象——构造函数注入
public class Driver implements IDriver {

    private ICar car;

    public Driver(ICar _car) {
        this.car = _car;
    }

    public void driver() {
        this.car.run();
    }

}
  • Setter方法传递依赖对象——Setter依赖注入
public class Driver implements IDriver {

    private ICar car;

    /**
     * @param car the car to set
     */
    public void setCar(ICar car) {
        this.car = car;
    }

    public void driver() {
        this.car.run();
    }

}
  • 接口声明依赖对象——接口注入
public class Driver implements IDriver {

    public void driver(ICar car) {
        car.run();
    }

}

本质:

依赖倒置原则的本质就是通过抽象(接口或者抽象类)使各个类或模型的实现彼此独立,不互相影响,实现模块间的松耦合。

规则:

  • 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备;
  • 变量的表面类型尽量是接口或者抽象类;
  • 任何类都不应该从具体类派生;
  • 尽量不要覆写基类的方法;
  • 结合里氏替换原则使用。

接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化。

依赖倒置与依赖正置

依赖正置就是类间的依赖是实实在在的实现类间的依赖,也就是面向实现编程,这也是正常人的思维方式,我要开奔驰车就依赖奔驰车,我要使用笔记本电脑就直接依赖笔记本电脑,而编写程序需要的是对现实世界的事物进行抽象,抽象的结构就是有了抽象类和接口,然后我们根据系统设计的需要产生了抽象间的依赖,代替了人们传统思维中的事物间的依赖,“倒置”就是从这里产生的。

时间: 2024-10-10 00:05:15

Java设计原则—依赖倒置原则(转)的相关文章

设计模式六大原则---依赖倒置原则(DIP)

定义 依赖倒置原则(Dependency Inversion Principle) 核心思想:依赖于抽象     具体体现: 体现一:高层模块不应该依赖低层模块.两个都应该依赖抽象. 体现二:抽象不应该依赖细节.细节应该依赖抽象. 依赖倒置原则告诉我们:细节是多变的,而抽象是相对稳定的.所以我们编程的时候要注重抽象的编程,而非细节编程. 实例 1.AGP插槽:主板和显卡之间的关系的抽象.主板和显卡通常是使用AGP插槽来连接的,这样,只要接口适配,不管是主板还是显卡更换,都不是问题. 2.驾照:司

设计模式.设计原则-依赖倒置原则

1:依赖倒置原则在Java语言中的表现就是: 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的.接口或抽象类不依赖于实现类.实现类依赖与接口或抽象类. 采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并发开发引起的风险,提高代码的可读性和可维护性.依赖是可以传递的.只要做到抽象依赖,即使是多层的依赖传递也无所畏惧. 对象的依赖关系又三种方式来传递:1:构造函数传递依赖对象2:Setter方法传递依赖对象 3:接口声明依赖对象 2:最佳实践:

六大设计原则(三)DIP依赖倒置原则

原文:六大设计原则(三)DIP依赖倒置原则 依赖倒置原则DIP(Dependence Inversion Principle) 依赖倒置原则的含义 高层模块不能依赖低层模块,二者都应该依赖其抽象. 抽象不应该依赖于细节. 细节应该依赖抽象. 什么是高层模块?低层模块? 每一个原子逻辑就是低层模块,原子逻辑再组就是高层模块. 什么是抽象和细节? 抽象是抽象类,不可被实例化. 细节是实现类,比如实现的接口或继承抽象类的子类,可以被实例化. 表现在Java语言中就是面向接口编程 模块间的依赖是通过抽象

深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/22/solid-javascript-the-dependency-inversion-principle/ 依赖倒置原则 依赖倒置原则的描述是: A. High-level modules should not

依赖倒置原则:避免写出架构糟糕的代码

什么是依赖倒置原则 依赖倒置原则的原始定义为包含三个方面: 高层模块不应该依赖底层模块,两者都应该依赖其抽象 抽象不应该依赖细节 细节应该依赖抽象 高层模块和底层模块可能好理解些,因为每一个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块,原子逻辑的再组装就是高层模块.那什么是抽象,什么是细节呢?我们不妨回到 Java 语言本身去找答案吧:在 Java 中,抽象指接口或抽象类,两者均不能被实例化:细节就是实现类,实现类继承抽象类或实现接口,特点在于可被实例化,所以依赖倒置原则在 J

增删改查也有设计模式——依赖倒置原则另解

一个增删改查的例子解读面向接口编程和依赖倒置原则 依赖倒置原则介绍 依赖倒置原则包括两个部分 .高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象. 抽象不应该依赖于具体实现,具体实现应该依赖于抽象. 例子 现在有如下场景和需求:老板要求设计任务模块,包括发布任务和撤回任务等.假设这个需求只给了几个小时去做,那肯定是来不及设计了,写到哪算哪.定义撤回接口的控制层如下 @RequestMapping('cancel') @ResponseBody public String cancelT

面向对象原则之一 依赖倒置原则

原文:面向对象原则之一 依赖倒置原则 前言 面向对象有人分为五大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则. 也有人分为六大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则.迪米特法则. 现在我们来介绍依赖倒置原则 依赖倒置原则 1)概念 a.高层模块不应该依赖于底层模块,两者应该依赖于其抽象. b.抽象不应该依赖具体实现,具体实现应该依赖抽象. 上面2点是依赖倒置原则的概念,也是核心.主要是说模块之间不要依赖具体实现,依赖接

依赖倒置原则(DIP)

1. 定义 (1)高层模块不应依赖于低层模块,两者都应该依赖于抽象.(2)抽象不应该依赖于细节,细节应该依赖于抽象. 为什么是“倒置”这个词? 这是由于许多传统的软件开发方法,比如结构化分析和设计,总是倾向于创建一些高层依赖于低层模块.策略依赖于细节的软件结构.实际上这些方法的目的之一就是要定义程序层次结构,该层次结构描述了高层模块怎样调用低层模块.一个设计良好的面向对象的程序,其依赖于程序结构相对于传统的过程式方法设计的通常结构而言就是被“倒置”了. 高层模块包含了一个应用程序中的重要的策略选

设计模式 之 设计的 六大原则(3) 依赖倒置原则

依赖倒置原则 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修改类A,会给程序带来不必要的风险. 解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率. 依赖倒置原则基于这样一个事实:相对于