耦合
百度百科:
耦合也叫块间联系,指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差。
Java中耦合:
例如在web开发中,表现层需要持有业务层的对象,业务层中需要持有持久层的对象,这种关系是很强的依赖关系。
代码如下:
业务层:(在包service下)
package top.radish.service
public class AccountService {
// 持久层的AccountDao对象
private AccountDao accountDao = new AccountDao();
public void saveAccount(Integer num) {
accountDao.saveAccount(num)
}
}
持久层:(在dao下)
package top.radish.dao
public class AccountDao {
public void saveAccount(Integer num) {
// 保存到数据库
}
}
解释:
其中AccountService 类中,持有一个AccountDao 类的实例化对象,这种组合关系存在着依赖关系,即存在耦合性。
用图像解释如下:
高耦合的缺点:
- 连锁反应,修改一个模块,多个模块都需要进行修改
– 当AccountDao的标签名称被修改为时,业务层所有持有AccountDao的实例对象的类都需要进行修改。如AccountDao被修改为AccountDao1那么所有的业务层的private accountDao = new AccountDao()都要修改成为private accountDao = new AccountDao1()。当业务层的此种类过多时,修改需要大量的时间。 - 由于模块之间的相依性,模块的组合会需要更多的精力及时间
解耦
高耦合有很多的缺点,因此需要寻找一种方法来降低耦合度。
解耦思路
- 第一步:需要一个配置文件来配置我们的service和dao(配置文件可以选用xml或者properties)
- 第二部:读取配置文件,通过反射创建对象
解耦的简单实现。
- 这里配置文件选用的是properties(spring选用的为xml+dom4j)
- 反射需要知道类全限定类名
配置文件:bean.properties
// 其中accountDao为自己定义的名称,top.radish.dao.AccountDao为全限定类名
accountDao=top.radish.dao.AccountDao
创建一个对象生产的工厂:(这里不是工厂模式)
package top.radish.factory
/**
*对象生产工厂(这里就不进行异常的处理了)
*/
public class BeanFactory {
private static Properties pros;
static {
pros = new Properties();
// 加载配置文件
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
pros.load(in);
}
// 生产bean对象
public static Object getBean(String beanName) {
// 获取类的权限定类名
String path = pros.getProperty(beanName);
// 通过反射创建对象
Object value = Class.forName(beanPath).newInstance();
return value;
}
}
修改业务层代码:
package top.radish.service
public class AccountService {
// private accountDao = new AccountDao();
// 修改为:
private AccountDao accountDao = (AccountDao)BeanFactory.getBean("accountDao");
public void saveAccount(Integer num) {
accountDao.saveAccount(num)
}
}
图解以上代码:
工厂通过配置文件来给业务层提供持久层的实例对象,降低了业务层和持久层之间的耦合关系。例如AccountDao的标签名改为AccountDao1时,只需要将配置文件中类全限定名top.radish.AccountDao修改为top.radish.AccountDao1即可完成代码的修改,不需要大范围修改业务层中的代码,这样代码维护起来更加省时。
总结
- 其中的工厂并不是设计模式中的工厂模式
- spring框架中是通过dom4j+xml进行读取配置文件。
- 耦合不能完全消除,只能减少。
有错误的地方,请大家斧正