依赖倒置原则 & 接口隔离原则优化 Cache 类
一、依赖倒置原则
问题一:什么是依赖倒置原则?
依赖倒置原则的含义
依赖倒置原则(Dependence Inversion Principle,简称DIP。其含义分为三层:
模块间的依赖是通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
接口或抽象类不依赖于实现类;
实现类依赖接口或抽象类。
ps:书读百遍,其义自见。
依赖的具体写法
在接口的方法中声明依赖对象。该方法也叫做接口注入。
构造函数传递依赖对象。在类中通过构造函数声明依赖对象,按照依赖注入的说法这种方式叫做构造函数注入。
Setter方法传递依赖对象。在抽象中设置setter方法声明依赖关系,依照依赖注入的说法就是setter依赖注入。
问题二: 为什么有时候依赖倒置原则又被称为好莱坞原则?
好莱坞原则含义:
在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。
两者的关系:
低层次模块实现了高层次模块的接口,然后总是被高层次模块调用。
案例:
错误的依赖关系
Dao
类通过调用MysqlConnection
类的executeQuery
方法执行sql
语句,依赖关系如下图所示:
这里就违反了依赖倒置原则,高层模块DAO
强耦合了底层模块MysqlConnection
。如果系统需要更换数据库为SqlServer
,我们就不得不去修改Dao
类,增加一个SqlserverConnection
类,这又违反了面向对象设计的开闭原则。例子中的Dao
是一个不稳定、随时会因为底层模块的变更而出现BUG的类。
正确的依赖关系
Dao
类通过调用Connection
接口的executeQuery
方法执行sql
语句,依赖关系如下图所示:
修改后的Dao
类依赖于Connection
抽象接口,MysqlConnection
类也以实现接口的方式依赖于Dao
类。这时如果要更换为SqlServer
数据库,只要增加一个SqlserverConnection
类并实现Connection
接口就完成了,不需要去修改Dao
类了,大大的降低了耦合度。
二、 框架中,依赖导致的实现
php: Laravel中的容器,golang中也涉及到过,忘记了,后续补充吧……
评论