02.程序的耦合及解耦

参考的学习视频→https://b23.tv/av47952931/p82

什么是程序的耦合呢?我们来看一个例子↓

首先在idea中新建一个maven project,不选择任何骨架
 
 
在新建好的maven工程的pom文件中 添加打包形式<packaging>jar</packaging>和mysql依赖
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.44</version>
    </dependency>
</dependencies>

配置好的pom文件如下 

向数据库test中新建account表,并插入数据
use test;
create table account(
id int primary key auto_increment,
uname varchar(40),
money float
)character set utf8 collate utf8_general_ci;

insert into account(uname,money) values('aaa',1000);
insert into account(uname,money) values('bbb',5432);
insert into account(uname,money) values('ccc',6666);

新建一个类JdbcDemo1,在该类的main方法中

用传统方式编写java代码来查询数据库
public static void main(String[] args) throws Exception{
    //1.注册驱动
    DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    //2.获取连接
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","1234");
    //3.获取操作数据库的预处理对象
    PreparedStatement pstm = conn.prepareStatement("select * from account");
    //4.执行SQL,得到结果集
    ResultSet rs = pstm.executeQuery();
    //5.遍历结果集
    while(rs.next()){
        System.out.println(rs.getString("uname"));
    }
    //6.释放资源
    rs.close();
    pstm.close();
    conn.close();
}
运行程序,成功打印出了数据
 
 
 

*发现问题

当我们注释掉mysql的依赖语句后
 
 
再次运行,出现编译错误
 
 
这说明在没有依赖的情况下,该工程不能正常编译,这就是程序的耦合。
 
当我们把
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

换成

Class.forName("com.mysql.jdbc.Driver");
 

之后,再次运行,发现编译成功,而抛出的是异常而不是错误。 

这是用反射来创建对象的一个例子 ,它把依赖从编译阶段挪到了运行阶段。前一个方法依赖的是一个具体的驱动类,而后者只是依赖一个字符串,这样带来的好处是可以减少程序的耦合。

 

但这又带来一个新问题,由于这里的驱动类作为字符串已经在代码里固定了,如果我以后需要修改这个驱动类该怎么办呢?于是我们需要通过读取配置文件来获取要创建的对象全限定类名。

 

总结一下

耦合:程序间的依赖关系,包括:
  • 类之间的依赖
  • 方法之间的依赖
解耦:降低程序间的依赖关系。
 
实际开发中:
  • 应该做到:编译期不依赖,运行时才依赖。
解耦的思路:
  • 第一步:使用反射来创建对象,而避免使用new关键字。
  • 第二步:通过读取配置文件来获取要创建的对象全限定类名。
发布了51 篇原创文章 · 获赞 1 · 访问量 1087

猜你喜欢

转载自blog.csdn.net/si_si_si/article/details/104656668