目录

三层架构

1.什么是三层架构

三层架构就是将整个业务划分为三层:表示层、业务逻辑层、数据访问层。

2.层与层之间的关系

3.怎么理解三层架构

4.为什么需要三层架构

区分层次的目的是为了“高内聚,低耦合”的思想;

简单来说,就是解耦:只做自己功能内的事。

5.两层与三层的区别

6.现状分析

我们目前是直接在表示层(servlet)调用了数据访问层dao(相当于服务员直接找到了采购员),不合适!因此,我们应该增加业务逻辑层biz,在servlet中调用biz,biz中调用dao !

7.面向接口编程.

8.使用三层架构实现登录功能

//将设计和实现完全分离 //接口:只做设计

9.一剂强心针

注意:以上两种任选其一,不要混合使用


三层架构


1.什么是三层架构

  • 三层架构就是将整个业务划分为三层:表示层、业务逻辑层、数据访问层。

  • 表示层主要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户所需要的数据;

  • 业务逻辑层表示层和数据访问层之间的桥梁,实现业务逻辑,具体包含:验证、计算、业务规则等等;

  • 数据访问层与数据库打交道,主要实现对数据的增、删、改、查。

  • 注意: entity(实体类) 它不属于三层中的任何一层, 但是它贯穿于三层,能在三层之间传递数据。

2.层与层之间的关系

3.怎么理解三层架构

服务员:只管接待客人;

厨师:只管做客人点的菜;

采购员:只管按要求采购食材。

4.为什么需要三层架构

  • 区分层次的目的是为了“高内聚,低耦合”的思想;

  • 高内聚 :尽可能类的每个成员方法只完成一件事

  • 低耦合 :减少类内部,一个成员方法调用另一个成员方法

  • 从类角度来看, 高内聚低耦合:减少类内部,对其他类的调用

  • 从功能块来看, 高内聚低耦合:减少模块之间的交互复杂度

  • 简单来说,就是解耦:只做自己功能内的事。

  • 他们各司其职,服务员不用了解厨师如何做菜,不用了解采购员如何采购食材;厨师不用知道服务员接待了哪位客人,不用知道采购员如何采购食材;同样,采购员不用知道服务员接待了哪位客人,不用知道厨师如何做菜。

  • 任何一层发生变化都不会影响其他层:

    • 服务员(表示层)请假——另找服务员;

    • 厨师(业务逻辑层)辞职——招聘另一个厨师;

    • 采购员(数据访问层)辞职——招聘另一个采购员。

5.两层与三层的区别

两层: 当任何一个地方发生变化时,都需要重新开发整个系统。“多层”放在一层,分工不明确耦合度高,难以适应需求变化,可维护性低、可扩展性低;

三层:发生在哪一层的变化,只需更改该层,不需要更改整个系统。层次清晰,分工明确,每层之间耦合度低——提高了效率,适应需求变化,可维护性高,可扩展性高。

6.现状分析

我们目前是直接在表示层(servlet)调用了数据访问层dao(相当于服务员直接找到了采购员),不合适!因此,我们应该增加业务逻辑层biz,在servlet中调用biz,biz中调用dao !

7.面向接口编程.

旨在将设计与实现完全分离.

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各 对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的, 这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

8.使用三层架构实现登录功能

//将设计和实现完全分离
//接口:只做设计

public interface IUserDao {
/**
* 登录
* @param uname 用户名
* @param upwd 密码
* @return 用户对象
*/
public User login(String uname,String upwd);

}

/**
* 数据访问层:增删改查
* @author PC
*
*/
public class UserDao implements IUserDao {

//以前这个类怎么写 现在仍然怎么写

private Connection con = null;
private PreparedStatement ps =null;
private ResultSet rs = null;

@Override
public User login(String uname, String upwd) {
User u = null;
try {
con=DBHelper.getCon();
String sql=“select * from tb_user where uname=” />;
ps=con.prepareStatement(sql);
ps.setString(1, uname);
ps.setString(2, upwd);
rs=ps.executeQuery();
if(rs.next()) {
u=new User(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return u;
}

/**
* 业务逻辑层
* @author PC
*
*/
public class UserBiz implements IUserBiz {
//业务逻辑层biz 调用 数据访问层dao(里氏替换原则)
IUserDao iud =new UserDao();

/**

*表示层

*/

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//表示层 调用 业务逻辑层里氏替换原则()
IUserBiz iub = new UserBiz();

}

9.一剂强心针

注意:以上两种任选其一,不要混合使用