目录
三层架构
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=? 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.一剂强心针