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"); } }
那么这样是十分麻烦的,因为只要数据访问层发生改变,那么业务层也会随之变化,因此需要降低这两层之间的耦合度
利用工厂方法来实现上述目标:
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的两层代码无需发生任何改变。