博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象设计原则-依赖倒置
阅读量:7218 次
发布时间:2019-06-29

本文共 1573 字,大约阅读时间需要 5 分钟。

依赖倒置

在面向对象设计中有一个重要的原则是依赖倒置(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类了,大大的降低了耦合度。

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

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

参考资料:

转载地址:http://wvxym.baihongyu.com/

你可能感兴趣的文章
jetty404web界面服务器信息隐藏
查看>>
22个Photoshop网页设计教程网站推荐
查看>>
如何让程序员更容易的开发Web界面?重构SmartAdmin展示TinyUI
查看>>
centos7 python2和python3共存
查看>>
rhel6.2配置在线yum源
查看>>
分级聚类算法
查看>>
Web Services 入门(之二)
查看>>
随机模拟MCMC和Gibbs Sampling
查看>>
网络安全是一种态度
查看>>
POJ1131 Octal Fractions
查看>>
mysql-ulogd2.sql
查看>>
119. Pascal's Triangle II - Easy
查看>>
349. Intersection of Two Arrays - Easy
查看>>
[算法练习]最长公共子串(LCS)
查看>>
p转c++
查看>>
树(tree)
查看>>
codevs——2645 Spore
查看>>
ssh服务之 远程登录和端口转发
查看>>
java环境配置正确,但是tomcat不能启动的解决办法
查看>>
我就是想找个人聊聊天,说说我这近四年来的经历
查看>>