java-IOC(控制反转) 理论推导

IOC (控制反转)

控制反转: 面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

为什么要是用控制反转IOC?

首先出场景:
在这里插入图片描述

  • IocDao.java
public interface IocDao {

    public void TestIoc();
}
  • IocDaoImpl.java
public class IocDaoImpl implements IocDao{
    @Override
    public void TestIoc() {
        System.out.println("这里是在IocDaoImpl 重写了IocDao 的TestIoc这个方法");
    }
}
  • IocDaoImpl2.java
public class IocDaoImpl2 implements IocDao{
    @Override
    public void TestIoc() {
        System.out.println("这里是在IocDaoImpl2 重写了IocDao 的TestIoc这个方法");
    }
}
  • IocService.java
public interface IocService {
    public void TestIoc();
}
  • IocServiceImpl.java
public class IocServiceImpl implements IocService{
    private IocDao iocDao;
    @Override
    public void TestIoc() {
        iocDao=new IocDaoImpl();
        iocDao.TestIoc();
    }
}

测试类:

  • Test.java
public class Test {
    public static void main(String[] args) {
        IocService iocService = new IocServiceImpl();
        iocService.TestIoc();
    }
}

在这里插入图片描述

此时我们是调用了 IocDao 接口的实现类IocDaoImpl里面的方法,假设现在增加了一个IocDao的实现类IocDaoImpl2,如果想实现IocDaoImpl 里面的方法,就需要去修改 IocServiceImpl 的实现类对应的实现:

public class IocServiceImpl implements IocService{
    private IocDao iocDao;
    @Override
    public void TestIoc() {
        iocDao=new IocDaoImpl2();
        iocDao.TestIoc();
    }
}

在这里插入图片描述

注意: 这里解释一下,为什么不是在IocServiceImpl 中新增一个实现方法来达到目的,其一我们是想用这个例子来引入我们为什么要使用IOC,其二是因为我们要保持在低耦合性,如果我们新增了一个实现方法来达到目的,那么我们的测试方法是不是也要修改?这显然不不现实


可以看到每当我们新增一个IocDao的实现类,像实现其新增实现类的方法,都需要去修改 IocServiceImpl 里的实现,这很显然与我们所推崇的 高内聚、低耦合相违背;

我们可以稍微修改一下我们的 IocServiceImpl 中的实现方法:

public class IocServiceImpl implements IocService{
    private IocDao iocDao;

    public IocDao getIocDao() {
        return iocDao;
    }

    public void setIocDao(IocDao iocDao) {
        this.iocDao = iocDao;
    }

    @Override
    public void TestIoc() {
        iocDao.TestIoc();
    }
}

再看我们的测试类:

public class Test {
    public static void main(String[] args) {
        IocServiceImpl iocService = new IocServiceImpl();
        iocService.setIocDao(new IocDaoImpl());
        iocService.TestIoc();

        iocService.setIocDao(new IocDaoImpl2());
        iocService.TestIoc();
    }
}

在这里插入图片描述
可以看到我们只对IocServiceImpl 做了一个简单的改变,然后,无论IocDao 增加多少个IocDaoImpl 的实现类,我们只需要在实际使用的时候(这里用Test类做对比),选择我们所需要使用实现类的方法即可;即我们不需要再对IocServiceImpl 作出相应的改变了,大大的降低了代码的耦合性。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈行恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值