三层架构
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=? and upwd=?"; 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.一剂强心针