Java中的耦合和解耦

耦合

百度百科:
耦合也叫块间联系,指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差。

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进行读取配置文件。
  • 耦合不能完全消除,只能减少。

有错误的地方,请大家斧正

猜你喜欢

转载自blog.csdn.net/weixin_44736584/article/details/106289208