合并和取消合并程序
偶联反应
指程序之间的依赖关系,如类之间的依赖关系和方法之间的依赖关系
解除结合
应该降低程序之间的依赖关系,使其在实际开发中不依赖于编译器,而依赖于运行时
解除结合的想法
使用反射创建对象,但不使用new关键字
读取配置文件以获取要创建的对象的全限定类名
举个例子
让我们看一个简单的例子。 模拟帐户的保存
项目的文件结构如图所示
业务层接口及其实现类:
package com.itheima.service;
//*
* @Author:Zzq
* @Description:帐户的业务层接口
* @Date:2020/6/13
* @Time:15:50
*/
publicinterfaceiaccountservice{
//*
*@Author:Zzq
*@Description:伪存储帐户
*@Date:2020/6/13
*@Param: * @param null
*/
void保存帐户(;
}
package com.it heima.service.impl;
import com.it heima.factory.bean factory;
import com.it heima.mapper.iaccountmapper;
import com.it heima.service.iaccount service;
//*
* @Author:Zzq
* @Description:账户的业务实现类
* @Date:2020/6/13
* @Time:15:53
*/
publicclassaccountserviceimplimplementsiaccountservice
privateiaccountmapperaccountmapper=newaccountmapperimpl (;
@Override
公共语音保存帐户
accountMapper.saveAccount (;
}
}
持久层的接口及其实现类
package com.itheima.mapper;
//*
* @Author:Zzq
* @Description:帐户持久层界面
* @Date:2020/6/13
* @Time:16:08
*/
公共接口iaccountmapper {
void保存帐户(;
}
package com.itheima.mapper.impl;
import com.it heima.mapper.iaccountmapper;
//*
* @Author:Zzq
* @Description:帐户的持久层实现类
* @Date:2020/6/13
* @Time:16:10
*/
publicclassaccountmapperimplimplementsiaccountmapper {
公共语音保存帐户
System.out.println ('已保存);
}
}
最后是main函数,也是其表示层
package com.itheima.ui;
import com.it heima.factory.bean factory;
import com.it heima.service.iaccount service;
//*
* @Author:Zzq
* @Description:模拟用于调用业务的表现层
* @Date:2020/6/13
* @Time:22:28
*/
公共类客户端{
publicstaticvoidmain (string [ ] args ) {
accountserviceimplas=newaccountserviceimpl (;
as.saveAccount (;
}
}
从代码中可以看出,各层次相互依存、分层应用,这被称为高结合,各代码块的
间独立性较差,下面就按照解耦的思路来尽可能降低耦合,如下:1.在项目文件中新建一个factory包,新建一个BeanFactory类来建立一个bean工厂来创建我们的service和mapper对象,并写好Bean.properties配置文件
package com.itheima.factory;
import java.io.InputStream;
import java.util.Properties;
/**
* @Author:Zzq
* @Description:是一个创建bean对象的工厂
*
* Bean:在计算机英语中,有可重用组件的含义。
* JavaBean:用Java编写的可重用组件。
* Java >> 实体类
* 它就是创建我们的service和mapper对象的。
* 1.需要一个配置文件来配置我们的service和mapper
* 配置的内容:唯一标识 = 全限定类名(key = value)
* 2.通过读取配置文件的配置内容,反射创建对象
*
* 配置文件可以是xml也可以是properties
* @Date:2020/6/13
* @Time:22:36
*/
public class BeanFactory {
//定义一个properties对象
private static Properties props;
//使用静态代码块为Properties对象赋值
static {
try {
//实例化对象
props = new Properties();
//获取properties文件的流对象
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
}catch (Exception e) {
throw new ExceptionInInitializerError("初始化properties失败");
}
}
/**
*@Author:Zzq
*@Description:根据bean的名称获取bean对象
*@Date:2020/6/13
*@Param: * @param null
*/
public static Object getBean(String beanName){
Object bean = null;
try {
String beanPath = props.getProperty(beanName);
bean = Class.forName(beanPath).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return bean;
}
}
accountService = com.itheima.service.impl.AccountServiceImpl
accountMapper = com.itheima.mapper.impl.AccountMapperImpl
2.修改Client.java和AccountServiceImpl.java代码,使用反射来创建对象
package com.itheima.ui;
import com.itheima.factory.BeanFactory;
import com.itheima.service.iAccountService;
/**
* @Author:Zzq
* @Description:模拟一个表现层,用于调用业务
* @Date:2020/6/13
* @Time:22:28
*/
public class Client {
public static void main(String[] args) {
iAccountService as = (iAccountService) BeanFactory.getBean("accountService");
as.saveAccount();
}
}
package com.itheima.service.impl;
import com.itheima.factory.BeanFactory;
import com.itheima.mapper.iAccountMapper;
import com.itheima.service.iAccountService;
/**
* @Author:Zzq
* @Description:账号的业务实现类
* @Date:2020/6/13
* @Time:15:53
*/
public class AccountServiceImpl implements iAccountService {
private iAccountMapper accountMapper = (iAccountMapper) BeanFactory.getBean("accountMapper");
@Override
public void saveAccount() {
accountMapper.saveAccount();
}
}
以上就是解耦的过程,在使用了BeanFactory了之后,就算是删除掉了service或mapper文件,编译器也不会报错,有人看到这里肯定会说:啊,你这不是脱裤子放屁嘛,明明几个类就能解决的问题非要弄个工厂?其实是这个例子太高简单,还不足以看出低耦合的好处,在以后比较大型的开发中,如果有新的需求要加入,我们就可以只添加几个类就能完成,而不用重新考虑整个程序,避免牵一发而动全身。