企业做开发会涉及到以下四个点:
1.系统的耦合性(紧密度):藕断丝连,与系统的多个部分都有联系
2.系统的拓展性
3.代码的可读性
4.业务的拓展性
耦合性:
比如:公司开发了一个系统,会有 用户系统,订单系统,物流系统,如果用户系统和订单系统处于一个你中有我,我中有你的一个紧密状态,说明二者的耦合性很高,那么其中一个系统坏了,另一个系统就用不了了,还会影响系统的拓展性,这个就体现了耦合性。
因此,耦合性太高,对于系统来说是不好的
以上咱们可以了解到,耦合性太高会造成的影响,所以,为了降低这种耦合性(解耦),咱通常会在开发时采用分层的模式,这种模式中常见的有今天我们要重点讲解的三层架构
目录
- 一、了解分层与分层模式
- 1.为什么需要分层
- 2.分层模式
- 3.分层
- 二、 三层架构(三层模式)
- 1. 什么是三层?
- 2.为什么用它? why?
- 三、面向接口编程
- 四、详细代码
一、了解分层与分层模式
1.为什么需要分层
jsp开发的弊端:业务处理的代码与jsp代码混在一起,不易于阅读,不易于代码维护:
2.分层模式
- 分层模式是最常见的一种架构模式
- 分层模式是很多架构模式的基础
3.分层
- 将解决方案的组件分隔到不同的层中
- 在同一个层中组件之间保持内聚性
- 层与层之间保持松耦合
二、 三层架构(三层模式)
1. 什么是三层?
- 表示层:只要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据
- 业务逻辑层:表示层和数据访问层之间的桥梁,实现业务逻辑,具体包含:验证,计算,业务 规则等等
- 数据访问层:与数据库打交道,只要实现对数据的增,删,改,查
下面是思维理解图
表示层 UI:相当于jsp(服务员:给别人做显示)
业务逻辑层 BIZ:相当于biz(厨师:针对数据进行加工)
数据访问层 DAL:对应dao(仓库管理员:从数据库拿数据)
所以就相当于:
2.为什么用它? why?
三层架构的特征:
各司其职:
服务员就是专门和顾客直接交流的,为顾客点菜
厨师只需要根据顾客点的菜来做
采购员只需根据顾客德才准备食材,交给厨师即可
用三层架构的目的就是为了实现 高内聚,低耦合 的思想:
高内聚:尽可能类的每个成员方法只完成一件事
低耦合:减少类内部,一个成员方法调用另一个成员方法
减少耦合性就是(解耦),只做自己功能内的事
因此
服务员(UI层):请假——>另找服务员
厨师(BLL层):辞职——>招聘另一个厨师
采购员(DAL层):辞职——>招聘另一个采购员
(任何一层发生变化都不会影响到另外一层!!!)
三、面向接口编程
设计与实现分开:
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程
实现方式:
在开发时建立以下几个包:
含义:
* biz:存放业务逻辑层接口
* biz.impl:存放业务逻辑层的实现类
* dao:存放数据访问层的接口
* dao.impl:存放数据访问层的实体类
* entity:存放实体类
* util:存放帮助类,如DBHelper
四、详细代码
用户登录首页 index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
//单体数据
new NewsDao().queryAll();
//多个表的数据
//1.多表查询语句
//2.从dao里面取出连多个表的数据
//dao 拿数据 加工
//jsp 显示
//拿数据:仓库(数据库)管理员 dao
//针对数据进行加工:厨师 biz
//给别人做显示:服务员 jsp
//用户在页面上发起了一个请求(jsp上点击了一个按钮)
// 【西红柿炒蛋】
//请求给到biz【没有西红柿,没有炒蛋】
// 【告诉dao,我需要西红柿(数据),鸡蛋(数据)】
//1.西红柿dao包-》西红柿
//2.鸡蛋dao包-》鸡蛋
//biz处理数据,将西红柿+鸡蛋-》西红柿炒鸡蛋
//jsp页面:显示功能【上菜】
<form action="doLogin.jsp">
<input type="text" name="username">
<br>
<input type="text" name="password">
<br>
<button>登录</button>
</form>
</body>
</html>
处理用户登录 doLogin.jsp的页面:
<%@page import="com.zking.pojo.User"%>
<%@page import="com.zking.biz.IUserBiz"%>
<%@page import="com.zking.biz.impl.UserBizImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//表示层-》业务逻辑层(biz)-》数据库操作层(dao)
String username=request.getParameter("username");
String password=request.getParameter("password");
User user=new User(username,password);
//登录
IUserBiz userBiz=new UserBizImpl();
//调用业务逻辑层的方法
String message=userBiz.login(user);
//输出结果
out.print(message);
%>
业务逻辑层接口代码 IUserBiz.java:(前面带 I 的,表示是接口)
package com.zking.biz;
import com.zking.pojo.User;
public interface IUserBiz {//用户业务逻辑层的接口
String login(User user);//接口没有实现
}
实体类代码 User.java:
package com.zking.pojo;
public class User {//用户实体类
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
public User() {
// TODO Auto-generated constructor stub
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
}
业务逻辑层接口的实现类代码UserBizImpl.java:(后面是Impl的,表示是实现类)
package com.zking.biz.impl;
import com.zking.biz.IUserBiz;
import com.zking.dao.IUserDao;
import com.zking.dao.impl.UserDaoImpl;
import com.zking.pojo.User;
public class UserBizImpl implements IUserBiz{//用户逻辑接口实现类
//使用接口来声明,用子类来实现
//里氏替换原则
private IUserDao userDao=new UserDaoImpl();
//biz-》dao
@Override
public String login(User user) {
//1.先拿到dao数据
User u=userDao.queryByName(user);
//2.处理数据
if(u!=null) {
return "登陆成功";
}
return "登录失败";
}
}
数据访问层接口代码 IUserDao.java:
package com.zking.dao;
import com.zking.pojo.User;
public interface IUserDao {//用户的数据库操作接口
User queryByName(User user);
}
数据访问层接口的实现类代码 UserDaoImpl.java:
package com.zking.dao.impl;
import com.zking.dao.IUserDao;
import com.zking.pojo.User;
public class UserDaoImpl implements IUserDao{//用户的数据库操作接口实现类
@Override
public User queryByName(User user) {
// 根据用户名和密码去数据库查询数据
if("root".equals(user.getUsername())&&"123".equals(user.getPassword())) {
return new User("","");
}
return null;
}
}