企业做开发会涉及到以下四个点:
1.系统的耦合性(紧密度):藕断丝连,与系统的多个部分都有联系
2.系统的拓展性
3.代码的可读性
4.业务的拓展性

耦合性:
比如:公司开发了一个系统,会有 用户系统,订单系统,物流系统,如果用户系统和订单系统处于一个你中有我,我中有你的一个紧密状态,说明二者的耦合性很高,那么其中一个系统坏了,另一个系统就用不了了,还会影响系统的拓展性,这个就体现了耦合性。

因此,耦合性太高,对于系统来说是不好的

以上咱们可以了解到,耦合性太高会造成的影响,所以,为了降低这种耦合性(解耦),咱通常会在开发时采用分层的模式,这种模式中常见的有今天我们要重点讲解的三层架构


目录

  • 一、了解分层与分层模式
  • 1.为什么需要分层
  • 2.分层模式
  • 3.分层
  • 二、 三层架构(三层模式)
  • 1. 什么是三层?
  • 2.为什么用它? why?
  • 三、面向接口编程
  • 四、详细代码


一、了解分层与分层模式

1.为什么需要分层

jsp开发的弊端:业务处理的代码与jsp代码混在一起,不易于阅读,不易于代码维护:

2.分层模式

  1. 分层模式是最常见的一种架构模式
  2. 分层模式是很多架构模式的基础

3.分层

  1. 将解决方案的组件分隔到不同的层中
  2. 在同一个层中组件之间保持内聚性
  3. 层与层之间保持松耦合

二、 三层架构(三层模式)

1. 什么是三层?

  1. 表示层:只要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据
  2. 业务逻辑层:表示层和数据访问层之间的桥梁,实现业务逻辑,具体包含:验证,计算,业务 规则等等
  3. 数据访问层:与数据库打交道,只要实现对数据的增,删,改,查
    下面是思维理解图

表示层 UI:相当于jsp(服务员:给别人做显示)
业务逻辑层 BIZ:相当于biz(厨师:针对数据进行加工)
数据访问层 DAL:对应dao(仓库管理员:从数据库拿数据)

所以就相当于:

Java识别数据耦合 java耦合性_html

2.为什么用它? why?

三层架构的特征:

各司其职:

服务员就是专门和顾客直接交流的,为顾客点菜

    厨师只需要根据顾客点的菜来做

    采购员只需根据顾客德才准备食材,交给厨师即可

用三层架构的目的就是为了实现 高内聚,低耦合 的思想:

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

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

减少耦合性就是(解耦),只做自己功能内的事

因此

服务员(UI层):请假——>另找服务员
厨师(BLL层):辞职——>招聘另一个厨师
采购员(DAL层):辞职——>招聘另一个采购员
(任何一层发生变化都不会影响到另外一层!!!)

三、面向接口编程

设计与实现分开:

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

实现方式:

在开发时建立以下几个包:

Java识别数据耦合 java耦合性_Java识别数据耦合_02


含义:

* 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;
	}
 
}