连接MySQL实现登录功能
控制层UserController
public class UserController {
//多态,半面向接口编程
private UserService userService = new UserServiceImpl();
public void login(){
String username = "admin";
String password = "123456";
boolean success = userService.login(username, password);
if (success) {
// 登录成功
} else {
// 登录失败
}
}
}
业务层的UserService接口及其实现类UserServiceImpl
public interface UserService {
boolean login(String username, String password);
}
public class UserServiceImpl implements UserService {
//多态,面向接口编程
private UserDao userDao = new UserDaoImplForMySQL();
public boolean login(String username, String password) {
User user = userDao.selectByUsernameAndPassword(username, password);
if (user != null) {
return true;
}
return false;
}
}
数据访问层的UserDao接口及其实现类UserDaoImplForMySQL
public interface UserDao {
User selectByUsernameAndPassword(String username, String password);
}
public class UserDaoImplForMySQL implements UserDao {
public User selectByUsernameAndPassword(String username, String password) {
// 连接MySQL数据库,根据用户名和密码查询用户信息
return null;
}
}
功能扩展连接Oracle实现登录
若更换到Oracle数据库上则需要再提供一个UserDaoImplForOracle, 这样就引起了连锁反应,UserServiceImpl类代码需要修改违背了OCP开闭原则
public class UserDaoImplForOracle implements UserDao {
public User selectByUsernameAndPassword(String username, String password) {
// 连接Oracle数据库,根据用户名和密码查询用户信息
return null;
}
}
public class UserServiceImpl implements UserService {
// 在进行功能扩展的时候修改了源代码, 违背了OCP开闭原则
// private UserDao userDao = new UserDaoImplForMySQL();
private UserDao userDao = new UserDaoImplForOracle();
public boolean login(String username, String password) {
User user = userDao.selectByUsernameAndPassword(username, password);
if (user != null) {
return true;
}
return false;
}
}
OCP开闭原则
对外扩展开放修改关闭: 软件开发过程中若在进行功能扩展的时候添加额外的类是没问题的,但因为功能扩展而修改之前运行正常的程序这是不被允许的
传统方式的MVC架构,上层是依赖下层的代码之间的耦合度太高, 这样会导致只要下面改动上面必然也需要改,所谓牵一发而动全身
依赖倒置原则DIP
依赖倒置原则(Dependence Inversion Principle): 就是倡导面向抽象编程,完全面向接口编程,不要面向具体编程
半面向接口编程: 对象的创建和属性的赋值都是手动, 使用到了具体的接口实现类
public class UserServiceImpl implements UserService {
//private UserDao userDao = new UserDaoImplForMySQL();
private UserDao userDao = new UserDaoImplForOracle();
public boolean login(String username, String password) {
User user = userDao.selectByUsernameAndPassword(username, password);
if (user != null) {
return true;
}
return false;
}
}
完全面向接口编程:对象的创建是自动的, 属性也是自动赋值的, 但是在执行的时候需要解决空指针异常的问题
public class UserServiceImpl implements UserService {
//private UserDao userDao = new UserDaoImplForMySQL();
//private UserDao userDao = new UserDaoIm plForOracle();
private UserDao userDao;
public boolean login(String username, String password) {
User user = userDao.selectByUsernameAndPassword(username, password);
if (user != null) {
return true;
}
return false;
}
}
控制反转IoC思想
控制反转(Inversion of Control)是面向对象编程中的一种设计思想或一种新型的设计模式(由于理论和时间成熟相对较晚,没有被纳入GoF23种设计模式范围内)
依赖注入手段(DI)
依赖注入是实现控制反转这种思想的一种常用实现手段 , 底层使用的是反射机制给属性赋值
依赖注入常见的实现方式包括两种