栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > 架构设计

Web开发之三层架构

架构设计 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Web开发之三层架构

目录

前言

正文内容 

分层与分层模式

分层

分层模式

为什么需要分层模式

分层开发的优势

分层的特点

分层的原则

1.封装性原则

2.顺序访问原则

三层架构(三层模式) 

三层架构的划分(哪三层)

三层架构的理解

实体层 

三层架构的原则

三层架构的特征

为什么需要使用三层架构

三层架构与两层架构的区别

面向接口编程

案例:使用三层架构实现用户登录


前言:

在企业进行Web项目的开发时,主要会考虑到以下几点:

1.系统的耦合性(紧密度):企业比较注重
耦合性:藕断丝连,系统的每个部分都有联系
比如:如果用户系统和订单系统之间的耦合性很高,那么一旦用户系统出问题了,订单系统也会出现问题,同时,用户系统和订单系统的耦合性太高,也会影响系统的拓展性和业务的拓展性。所以,项目各个部分之间的耦合性太高对系统来说是不好的
2.系统的拓展性
3.代码的可读性(容易被看懂):对程序员比较重要
4.业务的扩展性

:可以了解到,耦合性太高对系统的开发、升级、维护都会造成影响,所以,为了降低这种耦合性(解耦),通常会在开发时采用分层模式,这种架构模式中常见的有本期重点讲的三层架构

:三层架构即三层模式,所以在讲三层架构之前,先来了解一下分层与分层模式


正文内容: 

分层与分层模式

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

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

为什么需要分层模式

这是由于JSP在开发过程中存在弊端:

业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护,比如:

分层开发的优势
  • 复用代码
  • 职责划分清晰
  • 分离开发人员的管制
  • 无损替换(哪一部分出现问题直接使用一个新的这个部分,丢弃有问题的部分)
  • 降低了系统内部的依赖程度

分层的特点
  • 每一层都有自己的职责
  • 下一层不知道上一层的存在,仅完成自身的功能,不关心结果如何使用
  • 上一层不用关心下一层的实现细节,上一层通过下一层提供的对外接口来使用其功能
  • 上一层调用下一层的功能,下一层不能调用下上一层的功能
  • 每一层仅知道其下一层的存在,忽略其他层的存在

分层的原则

1.封装性原则
  • 每个层次向外公开接口,但是隐藏细节

2.顺序访问原则
  • 下一层为上一层服务,但不使用上一层的服务

三层架构(三层模式) 

三层架构的划分(哪三层)

专业解释:

  1. 表示层(UI,在Eclipse中是jsp) :主要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据 
  2. 业务逻辑层(BIZ):表示层和数据库访问层之间的桥梁,实现业务逻辑,具体包含:验证、计算、业务规则等等
  3. 数据访问层(DAO):与数据库打交道,主要实现对数据的增、删、改、查

图解:

三层架构的理解

通俗解释:

  1. 表示层(UI,在Eclipse中是jsp) :给别人做显示:服务员 
  2. 业务逻辑层(BIZ):针对数据进行加工:厨师 
  3. 数据访问层(DAO):从数据库中拿数据:采购员、仓库(数据库)管理员

图注释: 

顾客 :相当于客户端
服务员 :展示餐厅的菜品(展示数据),相当于表示层
厨师 :处理食材(处理数据),相当于逻辑处理层
采购员 :收购食材(获取数据),相当于数据访问层

实体层 

除了以上的三层外,还有一层是 Entity层 :实体层 

:实体层(如客户User)贯穿三层架构中的三层

三层架构的原则

1.上层依赖其下层,依赖关系不跨层

  •  表示层不能直接访问数据访问层
  • 上层调用下层的结果,取决于下层的实现

2.下一层不能调用上一层

3.下一层不依赖上一层

  • 上层的改变不会影响下一层
  • 下层的改变会影响上一层得到的结果

4. 在上一层中不能出现下一层的概念

  • 分工明确,各司其职

三层架构的特征

各司其职 :

  • 服务员就是专门和顾客直接交流的,为顾客点菜。表示层就相当于服务员,专门和用户打交道,获取用户的操作
  • 厨师只需要根据顾客点的菜来做。业务逻辑层就相当于厨师,从数据访问层拿来数据,根据表示层传来的用户操作去执行操作
  • 采购员只需根据顾客的菜准备食材,交给厨师即可。数据访问层就相当于采购员,用户需要什么数据,就从数据库或是文件中拿来此数据,交给业务逻辑

 每层之间关系特别(与三层开发的原则有关):

为什么需要使用三层架构

主要是为了实现高内聚低耦合(解耦)的思想:

  • 高内聚:尽可能类的每个成员方法只完成一件事
  • 低耦合:减少类内部,一个成员方法调用另一个成员方法

:从类角度来看, 高内聚低耦合就是减少类内部对其他类的调用。从功能块来看, 高内聚低耦合就是减少模块之间的交互复杂度。简单来说,就是解耦:只做自己功能内的事

  • 任何一层发生变化都不会影响到另外一层:

    

三层架构与两层架构的区别

两层:

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

三层:

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

面向接口编程

设计与实现分开:

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

实现方式:

在开发时建立如下包

含义:

  • biz : 存放业务逻辑层的接口
  • biz.impl :存放业务逻辑层的实现类
  • dao :存放数据访问层的接口
  • dao.impl :存放数据访问层的实现类
  • entity:存放实体类
  • util:存放帮助类,如DBHelper

案例:使用三层架构实现用户登录

在你的项目中建好以上的包、类:

含义:

  • com.biz包:  存放业务逻辑层的接口:IUserBiz.java
  • com.biz.impl包:  存放业务逻辑层的实现类:UserBizImpl.java
  • com.dao:  存放数据访问层的接口:IUserDao.java
  • com.dao.impl:  存放数据访问层的实现类:UserDaoImpl.java
  • com.pojo:存放实体类:User.java

经典案例:使用三层架构实现用户登录

用户登录首页代码:



数据访问层的接口代码:IUserDao.java

package com.dao;
import com.pojo.User;

public interface IUserDao {
	//查询方法
	User queryByName(User user);
}

数据访问层接口的实现类代码:UserDaoImpl.java

package com.dao.impl;
import com.dao.IUserDao;
import com.pojo.User;

public class UserDaoImpl implements IUserDao{
	@Override
	public User queryByName(User user) {
		//根据用户名和密码去数据库查询数据
		  if("aa".equals(user.getUsername())&&"123".equals(user.getPassword())){
	            return new User("","");
	        }
		return null;
	}	
}

业务逻辑层接口代码:IUserBiz.java

package com.biz;
import com.pojo.User;

public interface IUserBiz {
	//接口:规定实现类的规范
	//实现类必须要有登录方法
	String login(User user);//在接口中直接声明登录方法,不用代码体{}
}

业务逻辑层接口的实现类代码:UserBizImpl.java 

package com.biz.impl;
import com.biz.IUserBiz;
import com.dao.IUserDao;
import com.dao.impl.UserDaoImpl;
import com.pojo.User;

public class UserBizImpl implements IUserBiz{
	//业务逻辑层(IUserBiz)调用数据库操作层(userDao)
	//李氏替换原则
	private IUserDao userDao=new UserDaoImpl();
	@Override
	public String login(User user) {
		//biz包:处理数据
		 //1.先拿到dao包的数据
        User u = userDao.queryByName(user);
        //2.处理数据
        if(u!=null){
            return "登录成功";
        }
		return "登录失败";
	}
}

处理首页用户登录的代码: 

<%
	//从请求中拿数据
    String username=request.getParameter("username");
    String password=request.getParameter("password");
    User user = new User(username, password);

    //登录:
    //表示层(jsp)调用业务逻辑层(IUserBiz)
    //先new
     IUserBiz userBiz=new UserBizImpl();
    //再调用业务逻辑层(IUserBiz)的方法
    String message = userBiz.login(user);

    //输出结果
    out.print(message);
%>

 码字不易,点个赞再走呗

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/906426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号