转载自:https://mp.weixin.qq.com/s/VM6INdNB_hNfXCMq3UZgTQ
1.先实现一个接口
public interface UserDao {
public void getUser();
}
2.写接口的实现类
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("获取用户数据");
}
}
3.写一个service接口,写上接口的抽象功能
public interface UserService {
public void getUser();
}
4.最后写service接口的实现类,这里用于具体实现接口的功能
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
5.测试
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
缺点:耦合性大,一旦需求更改,需要新增一个对userDao接口的实现,并且service实现类需要作出对应的修改
在上述的第四部中,我们可以在不需要它的地方,不去实现它,而是留出一个接口,利用set,代码修改后
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set实现
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
测试
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );
service.getUser();
//那我们现在又想用Oracle去实现呢
service.setUserDao( new UserDaoOracleImpl() );
service.getUser();
}
通过set注入的方式,我们实现了权限的反转.
以前的所有东西都是由程序去进行控制创建,而现在是由我们自己自行控制创建对象,把主动权限交给调用者,程序不用去管怎么创建,怎么实现了,它仅仅负责一个接口
这样的思想,本质上解决了问题,不在需要去管理对象的创建,更多的精力去关注业务的实现,耦合性大大的降低了
原文:https://www.cnblogs.com/evilposeidon/p/13367307.html