什么是耦合
在软件工程中,耦合指的就是就是程序之间的依赖性。
包括:类之间的依赖,方法之间的依赖。
什么是内聚
内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。
内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。
解耦
降低程序之间的依赖关系。
我们要知道依赖关系是不可能完全消除的,那么我们该降低哪些依赖关系呢?
实际开发中应该做到:编译期不依赖,运行时才依赖
解耦的思路
第一步——使用反射来创建对象,从而避免使用new关键字
第二步——通过读取配置文件来获取要创建对象的全限定类名
实例
这是jdbc的获取连接的两个步骤,我们可以看到注册驱动这里,对com.mysql.jdbc.Driver()类有依赖
这样的代码同样也能注册驱动,但并不会产生依赖,在这里com.mysql.jdbc.Driver只是一个字符串。
我们先来看第一种,第一种方法就是实例化Driver类,并通过调用registerDriver()方法完成注册。
可以看到它是把要注册的驱动程序信息封装到了DriverInfo中,然后放进了一个List中。
第二种方法是怎么通过只要获得Driver的Class对象就可以完成注册呢,我们来看下Driver的源码
可以看到它是通过静态代码块实现的,根据类加载机制当执行 Class.forName(driverClass) 获取其Class对象时, com.mysql.jdbc.Driver 就会被JVM加载,连接,并进行初始化,初始化就会执行静态代码块,也就会执行下边这句代码:
使用第二种方式的好处就是,我们的类不在依赖具体的类,此时就算删除mysql驱动的jar包,依然可以编译(不能运行),同时也产生了另一个问题mysql 驱动的全限定类名字符串是在 java 类中写死的,一旦要改还是要修改源码。