面向对象设计原则-依赖倒置

依赖倒置

在面向对象设计中有一个重要的原则是依赖倒置(Dependence Inversion Principle),主要作用是解耦,让对象与对象之间松耦合。定义如下:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

光看定义很难理解依赖倒置到底是什么意思,先举一个简单的例子。

有以下两个类:

public class Dao {

    private MysqlConnection connection;

    public Dao(MysqlConnection connection) {
        this.connection = connection;
    }

    public void findAll() {
        connection.executeQuery("SELECT * FROM test");
    }

}
public class MysqlConnection {

    public void executeQuery(String sql) {
        System.out.println(sql);
    }

}

Dao类通过调用MysqlConnection类的executeQuery方法执行sql语句,依赖关系如下图所示:

这里就违反了依赖倒置原则,高层模块DAO强耦合了底层模块MysqlConnection。如果系统需要更换数据库为SqlServer,我们就不得不去修改Dao类,增加一个SqlserverConnection类,这又违反了面向对象设计的开闭原则。例子中的Dao是一个不稳定、随时会因为底层模块的变更而出现BUG的类。

现在根据依赖倒置原则对例子进行修改。

public class Dao {

    private Connection connection;

    public Dao(Connection connection) {
        this.connection = connection;
    }

    public void findAll() {
        connection.executeQuery("SELECT * FROM test");
    }

}
public interface Connection {

    void executeQuery(String sql);

}
public class MysqlConnection implements Connection {

    @Override
    public void executeQuery(String sql) {
        System.out.println(sql);
    }

}

Dao类通过调用Connection接口的executeQuery方法执行sql语句,依赖关系如下图所示:

修改后的Dao类依赖于Connection抽象接口,MysqlConnection类也以实现接口的方式依赖于Dao类。这时如果要更换为SqlServer数据库,只要增加一个SqlserverConnection类并实现Connection接口就完成了,不需要去修改Dao类了,大大的降低了耦合度。

之所以要细节依赖于抽象,归根结底是因为抽象是对细节的归纳和本质总结,细节可能会不停的变更,其本质却不会变化。依赖倒置原则感觉和面向接口编程的思想是如出一辙的,同样都是通过依赖抽象来降低耦合度,只是侧重点不同。

只是看书可能学习效率并不是很高,还是需要多写写学到的东西,这就是这篇文章出现的理由了。可能会有错误或不全的地方,欢迎指出。

我的个人博客

参考资料:


程序道路
记录一些东西
495 声望
23 粉丝
0 条评论
推荐阅读
HashMap的实现原理笔记
HashMap是Java中常用的Map接口的实现类,因为在日常工作中非常频繁的出现,所以在大部分的Java面试中都会问几个关于HashMap的问题。掌握HashMap的实现原理,已经是Java程序员的基础操作了。

Yuicon1阅读 2k

Java12的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft63阅读 12k

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 24.8k评论 1

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go35阅读 2.7k评论 1

封面图
Java11的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft28阅读 15.5k评论 3

Java5的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft13阅读 20.6k

Java9的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft20阅读 14.7k

495 声望
23 粉丝
宣传栏