浅谈控制反转(思想)

控制反转(思想)

通过下面的例子我们能可以更好的去理解IoC:

先看下项目结构:
在这里插入图片描述

  1. 先写个dao接口:UserDao

    public interface UserDao {
    
        void getUser();
    }
    
  2. 在写个dao的实现类:UserDaoImpl

    public class UserDaoImpl implements UserDao {
    
        @Override
        public void getUser() {
            System.out.println("默认获取用户数据!");
        }
    }	
    
  3. 写个Service接口:UserService

    public interface UserService {
    
        void getUser();
    }
    
  4. 再写个Service的实现类:UserServiceImpl

    public class UserServiceImpl implements UserService {
    
    //    组合
    
      private UserDao userDao = new UserDaoImpl();
    
    
        @Override
        public void getUser() {
                userDao.getUser();
        }
        
    }
    
  5. 写个测试类:MyTest

    public class MyTest {
    
        public static void main(String[] args) {
    
    //        用户实际调用的是业务层,dao层他们不需要接触
            UserService userService = new UserServiceImpl();
            
            userService.getUser();
    
        }
    }
    

    运行结果:

在这里插入图片描述

  1. 假如用户的需求变了,想通过Mysql获取用户数据

    解决:

    先在dao层添加个UserMysqlDaoImpl

    public class UserMysqlDaoImpl implements UserDao {
    
        @Override
        public void getUser() {
            System.out.println("Mysql获取用户数据!");
        }
    }
    

    再修改下serviceImpl里面的方法

    public class UserServiceImpl implements UserService {
    
    //    组合
        private UserDao userDao = new UserMysqlDaoImpl();
        @Override
        public void getUser() {
                userDao.getUser();
        }
    }
    

    再测试
    在这里插入图片描述

    要是用户需求再变,还得加dao实现类,还得换service里面的方法,要是代码量再大点,那真的是好麻烦啊啊

    面对需求百变的用户,有没有别的解决方案啊!

  2. 天无绝人之路,再棘手的问题总有个解决办法

    加个方法也许瞬间不一样了

    试试在UserServiceImpl里面加个set方法

    public class UserServiceImpl implements UserService {
    
    //    组合
    
        private UserDao userDao;
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public void getUser() {
                userDao.getUser();
        }
    }
    

    假如用户的需求又变了,用户又想用Oracle获取数据

    那来吧 So Easy!

    先加个UserOracleDaoImpl类

    public class UserOracleDaoImpl implements UserDao {
    
        @Override
        public void getUser() {
            System.out.println("Oracle获取用户数据!");
        }
    }
    

    再改个测试类:

    public class MyTest {
    
        public static void main(String[] args) {
    
    //        用户实际调用的是业务层,dao层他们不需要接触
            UserService userService = new UserServiceImpl();
            ((UserServiceImpl) userService).setUserDao(new UserOracleDaoImpl());
            userService.getUser();
    
        }
    }
    

    测试结果:
    请添加图片描述

    看出不一样没,service里面的东西不用变了

    用户的需求要变的话,我们就只用在dao层增加一个实现类就行了,其他的都不需要变

    真美啊,这下可省事儿了,哈哈哈哈

  3. 总结:

    传统的程序,因为是new出来的对象,程序的主动权在程序猿手里

    加个set方法以后,程序的主动权变到了用户手里

    这就是著名的控制反转啊,Inversion of Control,也不过如此嘛哈哈哈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值