程序间的耦合
耦合: 程序间的依赖关系
包括: 类之间的依赖, 方法之间的依赖
解耦: 降低程序间的依赖关系
实际开发中: 编译期不依赖, 运行时才依赖
理解: 来看一下这个jdbc连接数据库的代码
public static void main(String[] args) {
try {
// 1. 注册驱动类
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
//Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/queryprac","user","password");
String sql = "select * from account";
// 3.……
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
System.out.print(rs.getString("name"));
System.out.println(rs.getInt("money"));
}
rs.close();
pstmt.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
你会发现第一个获取驱动类的独立性是非常差的, 因为你需要在编译时就依赖相应的myql-connector-java的jar包, 否则就无法执行.
为了解决这个问题, 使之在编译期可以执行, 可以将其换成下面注释的写法, 不会再依赖于具体的某个类, 当然没有相应的驱动类仍然无法运行, 但是此时程序不会报错, 只是抛出异常, 说明可以编译, 只是无法运行
当然下面的写法仍然会带来问题, 由于直接写死了驱动类的字符串, 如果今后我们要换一个数据库, 就要改相应的驱动类了, 因此仍然是不合适的写法
解耦的思路:
第一步: 使用反射来创建对象, 而避免使用new关键字
第二步: 通过读取配置文件来获取要创建的对象全限定类名
例如解决上述依赖性问题的一个方法是:
用一个配置文件将驱动类配置进来, 然后通过读取配置文件的方式来得到要创建对象的全限定类名, 最后使用反射来创建对象