Java在web开发中,遵循分层开发思想:
- 表现层(User Interface layer)
直接和用户见面,大部分跟界面的开发有关(html,jsp,servlet) - 业务逻辑层(Business Logic Layer)
业务逻辑由一个到多个基本的增删改查组成 - 持久层(数据访问层)(Data access laye)
将数据永久的保存,jdbc与mybatis部分
我们希望在开发中层与层之间的耦合度尽可能的低,通俗的说就是代码与代码之间的依赖尽可能的低。
先看一个例子:
一段数据库插入与更新数据的简单代码,能说明问题即可:
package dao;
//Dao与其实现类相当于持久层
interface UserDao {
public void insert();
public void update();
}
class UserDaoDatabase implements UserDao {
public void insert() {
System.out.println(" UserDaoDatabase 数据库的实现 insert");
}
public void update() {
System.out.println(" UserDaoDatabase 数据库的实现 update");
}
}
//UserService相当于业务逻辑层
class UserService {
private UserDao userDao = new UserDaoDatabase;
public void service() {
userDao.insert();
userDao.update();
}
}
简单模拟分层,这里倘若出现新的需求,不再需要将数据写入数据库,而是写入文件保存,那么加上如下代码:
class UserDaoFile implements UserDao {
public void insert() {
System.out.println(" UserDaoDatabase 文件的实现 insert");
}
public void update() {
System.out.println(" UserDaoDatabase 文件的实现 update");
}
}
但是这样不仅数据访问层需要更改,业务层也需要更改,即:
private UserDao userDao = new UserDaoFile;
那么这样是十分麻烦的,因为只要数据访问层发生改变,那么业务层也会随之变化,因此需要降低这两层之间的耦合度。
利用工厂方法来实现上述目标:
import dao.UserDao;
import java.io.FileInputStream;
import java.util.Properties;
// 用户dao 的工厂类, 负责创建 UserDao对象
public class UserDaoFactory {
// 工厂方法模式 - factory-method 解耦了 service 和 dao 层
// 1. 利用了接口
// 2. 工厂方法
// 3. 把变化的部分放入外部配置文件
public static UserDao getUserDao() {
try {
Properties props = new Properties();
props.load(new FileInputStream("config.properties"));
System.out.println(props.get("dao.UserDao"));
String className = props.getProperty("dao.UserDao");
System.out.println(className);
// 根据字符串类名,反射得到类对象
Class c = Class.forName(className);
// 根据类对象,创建新的实例对象
UserDao userDao = (UserDao)c.newInstance();
return userDao;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
这样,把需要变更的地方,放在一个外部的配置文件中,config.properties如下:
dao.UserDao = dao.UserDaoFile/dao.UserDaodatebase
而业务层只需要如下更改:
private UserDao userDao = UserDaoFactory.getUserDao();
这样以后,当需求发生变更,只需要更改配置文件即可,从而降低耦合度,Java的两层代码无需发生任何改变。