架构师训练营 - 作业 2
1.请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则英文定义是: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。
翻译过来就是:
<1> 高层模块不应该依赖低层模块,两者都应该依赖其抽象
<2> 抽象不应该依赖细节,细节应该依赖抽象
依赖倒置原则在Java语言中的表现就是:
<1>模块间的依赖是通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的
<2>接口或抽象类不依赖于实现类,实现类依赖接口或抽象类
依赖倒转原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合,在项目中使用这个原则需要遵循以下的几个要求:
<1> 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
<2>变量的显示类型尽量是接口或者是抽象类
<3>任何类都不应该从具体类派生
<4>尽量不要覆写基类的方法
<5>结合里氏替换原则使用
依赖正置就是实现类间的依赖,也就是面向实现编程,而编写程序需要的是对实现类进行抽象,抽象的结果就是有了抽象类和接口,然后我们根据系统设计的需要产生了抽象间的依赖,代替了人们传统思维中的事物间的依赖,称为依赖倒置。采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。
在美国好莱坞众多电影工厂在寻找演员的时候通常奉行着这么一个原则:不要找我,需要的时候我去找你,把相同的思路运用到我们的软件工程里通常也被称作"好莱坞原则",即告诉开发者不要主动去构建依赖对象,而是在需要的时候由通过抽象接口由容器采用依赖注入把对象提供过来。而不是采用以前的new、工厂创建等方式创建实现类的依赖,核心思想就是:通过抽象接口间的依赖,由容器提供给我们需要的依赖对象。解耦了模块间的代码耦合,从这个角度来说,依赖倒置原则和好莱坞原则是一致的。
2.请描述一个你熟悉的框架,是如何实现依赖倒置原则的?
实例:
JDBC是Java制定的接口,为访问不同数据库提供了统一的途径,为开发者屏蔽了连接和访问不同数据库一些细节问题。数据库产商依照该接口编写与自家数据库配套的实现类。MySQL、Oracle、SqlServer等都有自己的不同实现,这些实现类的集合就是我们笼统意义上的“驱动”,让我们可以通过统一的接口访问不同的数据库。在代码中直接new具体的驱动类,会使程序高度耦合。比如,后期如果要切换数据库(虽然很少),就要临时调换驱动类,需要修改源码,不符合开闭原则。而面向接口编程,实际上就是一种"依赖倒置"。屏蔽具体的实现,只需调用接口方法,传入规定的参数即可得到预期的返回值。切换数据库驱动并不影响程序运行结果。
public static void main(String[] args) throws Exception {
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动
// 把Driver类装载进jvm
Class.forName("com.mysql.jdbc.Driver");
/*依赖倒置,依赖java.sql.Connection接口,根据不同的Driver类来获取抽象接口
** java.sql.Connection的实现类,本例中为
** com.mysql.jdbc.ConnectionImpl
*/
conn = DriverManager.getConnection(DB_URL, USER, PASS);
//调用Connection接口中的方法完成数据库CRUD
......
}catch (Exception ex){
......
}finally{
......
}
}
在JDBC的设计中,根据依赖倒置原则,实现了面向接口的编程,解耦了jdk数据库操作api与各不同数据库产商实现类代码,使得开发者通过一套统一规范的api访问不同产商不同版本的数据库产品,体现了jdk的精巧设计。
3.请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
评论