面向抽象(接口)编程的好处就是灵活性
例子:
对于一个User的JavaBean,对他进行保存。
其中有这几个包
cn.edu.hpu.model:存放实体类
cn.edu.hpu.Service:存放业务类
cn.edu.hpu.Dao:存放数据库连接类
如果要实现可以结合多个数据库的功能该怎么写比较灵活?用面向抽象的思想:
UserService:
UserDao:
其中一个Impl
UserDaoImpl:
例子:
对于一个User的JavaBean,对他进行保存。
其中有这几个包
cn.edu.hpu.model:存放实体类
cn.edu.hpu.Service:存放业务类
cn.edu.hpu.Dao:存放数据库连接类
如果要实现可以结合多个数据库的功能该怎么写比较灵活?用面向抽象的思想:
UserService:
package cn.edu.hpu.service;
import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.dao.UserDaoImpl;
import cn.edu.hpu.model.User;
public class UserService {
//Service完成的和Dao功能类似,为什么还要Service层呢?
//原因是Service这个层次完成功能除了把数据存储到数据库之外呢
//还可以完成“认证”等一些必要的业务功能,UserService对外
//公开的只是业务逻辑,而UserDao单纯的负责和数据库打交道
private UserDao userDao= new UserDaoImpl();
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(User u){
this.userDao.save(u);
}
}
UserDao:
package cn.edu.hpu.dao;
import cn.edu.hpu.model.User;
public interface UserDao {
//将Dao设置为接口,然后写Dao的Impl(实现)
//这样可以多写几个Impl,就可以实现多数据库的连接
//MySQLDaoImpl、SqlServerDaoImpl
//这就叫做面向抽象编程(原来是死的,没有灵活性)
public void save(User u);
}
其中一个Impl
UserDaoImpl:
package cn.edu.hpu.dao;
import cn.edu.hpu.model.User;
public class UserDaoImpl implements UserDao{
public void save(User u) {
//可以写任意的数据库连接代码
}
}
用大白话来说,你们家要想装修,墙要用壁纸,你要说用死了,我要用强生的壁纸,那你永远只能用强生的了,你要说我用符合国家某种规格的壁纸,那么你想换谁家的都可以。所以这就是灵活性。