软件开发中的三层结构

一、三层结构概述

在软件开发中,三层结构(Three - Tier Architecture)是一种常见的软件架构模式。它将软件系统分为三个主要的层次,即表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。每一层都有其特定的功能,并且层与层之间相互协作,以实现完整的软件功能。这种分层结构有助于提高软件的可维护性、可扩展性和可复用性。

二、各层详细介绍

  1. 表示层

    • 功能
      • 表示层是用户与软件系统直接交互的界面。它负责接收用户的输入(如鼠标点击、键盘输入等),并将这些输入传递给业务逻辑层进行处理。同时,它还负责将业务逻辑层处理后的结果以直观的方式呈现给用户,例如通过图形界面(GUI)、网页(HTML)等形式。
    • 示例
      • 在一个 Web 应用中,网页上的表单就是表示层的一部分。用户在表单中输入数据(如用户名和密码),然后点击提交按钮。这个按钮的点击事件会触发表示层将用户输入的数据发送到业务逻辑层进行验证等操作。在桌面应用中,一个窗口的界面布局和各种控件(如文本框、按钮)也是表示层,它们负责显示信息和接收用户操作。
    • 技术和工具
      • 对于 Web 应用,通常会使用 HTML、CSS 和 JavaScript 等技术来构建表示层。在桌面应用中,可能会使用像 JavaFX、Windows Forms(.NET)等框架来创建图形用户界面。
  2. 业务逻辑层

    • 功能
      • 业务逻辑层是整个软件系统的核心。它包含了软件系统的业务规则和业务流程。它接收表示层传来的用户请求,根据业务规则进行处理,例如数据验证、业务流程控制、计算等。它还负责协调数据访问层的操作,以获取或更新数据。
    • 示例
      • 以一个电商系统为例,业务逻辑层会包含处理订单的逻辑。当表示层传来一个用户下单的请求后,业务逻辑层会验证订单信息(如商品数量是否合法、用户账户余额是否足够等)。它还会根据库存管理的业务规则,检查商品库存是否满足订单需求。如果库存不足,可能会触发补货流程或者向用户提示库存不足的信息。
    • 技术和工具
      • 在这一层,通常会使用编程语言的高级特性来实现复杂的业务逻辑。例如,在 Java 中,可以使用面向对象的设计模式(如工厂模式、策略模式等)来组织和管理业务逻辑。对于大型企业级应用,可能会使用企业服务总线(ESB)来协调不同业务模块之间的通信。
  3. 数据访问层

    • 功能
      • 数据访问层主要负责与各种数据存储系统(如数据库、文件系统等)进行交互。它提供了对数据的读取、写入、更新和删除操作。它隐藏了数据存储的具体细节,使得业务逻辑层不需要关心数据是如何存储和检索的,只需要调用数据访问层提供的接口来获取或更新数据即可。
    • 示例
      • 在一个基于关系型数据库的应用中,数据访问层会包含 SQL 语句或者使用对象 - 关系映射(ORM)工具来执行数据库操作。比如,当业务逻辑层需要查询某个用户的订单信息时,数据访问层会根据业务逻辑层传递的参数(如用户 ID),构造合适的 SQL 查询语句(如 “SELECT * FROM orders WHERE user_id =?”),然后执行查询操作并将结果返回给业务逻辑层。
    • 技术和工具
      • 对于数据库访问,常见的技术包括使用ADO.NET(在.NET 环境中)、JDBC(在 Java 环境中)等直接操作数据库的技术。同时,ORM 框架如 Hibernate(Java)、Entity Framework(.NET)也被广泛应用,可以让开发者以面向对象的方式操作数据库,而不需要编写大量的 SQL 语句。
      • 建立一个图书馆查询所有图书,运用三场结构的方法
      • package org.appimport org.app.ui.LibrarayPresentationimport scala.io.StdIn
        object Main {def main(args: Array[String]): Unit = {val m = new LibrarayPresentation()m.showVisitorMenu()}
        }
        package org.app
        package models
        //图书类
        //id 书名 作者 状态
        case class BookModel (id:Int,name:String,author:String,status:String){}
        
        package org.app
        package serviceimport models.BookModel
        import org.app.dao.BookDAD
        import scala.collection.mutable.ListBuffer//图书业务逻辑层
        class BookService {private  val bookDAD = new BookDAD//查询所有的图书//def searchBooks(query:String):图书列表List(Book对象)def searchBooks(query:String):ListBuffer[BookModel] = {//从文本文件在读取书本信息,并保存列表中,返回bookDAD.loadBooks()}}
        
        package org.appimport org.app.ui.LibrarayPresentationimport scala.io.StdIn
        object Main {def main(args: Array[String]): Unit = {val m = new LibrarayPresentation()m.showVisitorMenu()}
        }
        1.人性的弱点,卡耐基,false
        2.理想国,柏拉图,false
        3.埃隆·马斯克传,艾萨克森,true
        4.苏东坡传,林语堂发,false
        5.杨苡口述自传,杨苡,余斌,true
        6.曾国藩传,张宏杰,true
        7.小王子,安托万·德·圣-埃克苏佩里,true
        8.毛泽东选集,毛泽东,true
        9.毛泽东传,胡绳,true
        10.毛泽东传,李锐,true
        11.test, 测试,true

三、三层结构的优点

  1. 可维护性
    • 由于各层职责明确,当软件系统需要进行维护时,开发人员可以很容易地定位问题所在的层次。例如,如果用户界面出现问题,主要在表示层进行修改;如果业务规则发生变化,只需要在业务逻辑层进行调整;如果数据库结构或者存储方式改变,重点在数据访问层进行更新。这种分层的方式使得软件系统的维护更加高效,降低了维护成本。
  2. 可扩展性
    • 软件系统可以很容易地进行功能扩展。例如,要添加一个新的业务功能,只需要在业务逻辑层添加相应的业务规则和处理逻辑,并在表示层添加相应的用户界面元素来触发和展示这个新功能。同时,如果需要更换数据存储方式(如从关系型数据库转换到非关系型数据库),只要修改数据访问层的实现,而不会影响业务逻辑层和表示层的正常运作。
  3. 可复用性
    • 各层的组件可以在不同的软件项目中进行复用。例如,数据访问层的数据库操作代码可以在多个具有相似数据存储需求的项目中使用。业务逻辑层的一些通用的业务处理模块(如用户认证模块)也可以被复用,这样可以提高软件开发的效率,减少重复开发的工作量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MQ】大白话告诉你什么是MQ,没有比这还详细还易懂的文章了吧,以RabbitMQ为例,从小白到大神

目录 分布式系统通信方式 MQ选型与应用场景 应用场景(优势) RabbitMQ工作模型 RabbitMQ简介 RabbitMQ 工作模型(流程)​编辑 Docker安装配置RabbitMQ RabbitMQ管理控制台 RabbitMQ 简单模式构建生产者 RabbitMQ 简单模式…

RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用

无人机与低空经济的关系密切,并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元,其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展,公共安防关乎每一个市民的生命财产安全。在…

PCIE概述

PCIE概述 文章目录 PCIE概述前言一、应用场景二、PCIE理论2.1 硬件2.2 拓扑结构:处理器和设备之间的关系2.3 速率2.4 层次接口2.5 四种请求类型2.5.1 bar空间2.5.2 memory2.5.3 IO2.5.4 configuration2.5.5 message 前言 参考链接: pcie总线知识点解析 …

SpringBoot SPI

参考 https://blog.csdn.net/Peelarmy/article/details/106872570 https://javaguide.cn/java/basis/spi.html#%E4%BD%95%E8%B0%93-spi SPI SPI(service provider interface)是JDK提供的服务发现机制。以JDBC为例,JDK提供JDBC接口,在包java.sql.*。MY…

超详细!Jmeter性能测试

前言 性能测试是一个全栈工程师/架构师必会的技能之一,只有学会性能测试,才能根据得到的测试报告进行分析,找到系统性能的瓶颈所在,而这也是优化架构设计中重要的依据。 测试流程: 需求分析→环境搭建→测试计划→脚…

快速本地化部署 OnlyOffice服务 ( Linux+Docker)

文章目录 一、OnlyOffice介绍📖二、集成OnlyOffice🧩2.1 环境准备🖥️2.2 搜索镜像2.3 拉取镜像2.4 查看镜像2.5 创建容器2.6 进入容器配置2.7 重启服务2.8 添加字体字号2.9 测试OnlyOffice服务 三、在线预览office文档四、Cpolar内网穿透 一…

加密--03--MD5-- JAVA运用(hutool工具包)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 hutool1.简介2.pom.xml3.Hutool-crypto概述4.MD5 加密 案例11.hutool依赖2.用户表3.加密方法4.业务代码 hutool https://www.hutool.cn/docs/#/ 1.简介 2.pom.xml …

CSS 实现带tooltip的slider

现代 CSS 强大的令人难以置信 这次我们来用 CSS 实现一个全功能的滑动输入器,也就是各大组件库都有的slider,效果如下 还可以改变一下样式,像这样 特别是在拖动时,tooltip还能跟随拖动的方向和速度呈现不同的倾斜角度&#xff0c…

关于SAP Router连接不稳定的改良

这个也是网上看来的,之前在用的时候也在想是不是建立一个长连接,就不至于断线。今天正好看到。 关于SAP Router连接不稳定的改良 我们在使用SAPRouter时经常会碰到断线,其发生原因有很多,如:网络不稳定、操作间隔时间…

docker 搭建自动唤醒UpSnap工具

1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件,进行配置: version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…

Python课设-谁为影狂-豆瓣数据【数据获取与预处理课设】

🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…

STM32 进阶SPI案例1:软件模拟SPI读写FLASH

需求描述 基于寄存器操作&#xff0c;使用软件模拟SPI协议&#xff0c;完成读写FLASH。 硬件电路设计 寄存器代码书写 main.c #include "usart1.h" #include "string.h" #include <stdio.h> #include "m24c02.h" #include "soft_…

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览

文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二&#xff09;使用 QtPdfium库实现…

【SpringCloud】OpenFeign配置时间Decode

文章目录 1.自定义反序列化器2.配置类与自定义 ObjectMapper客户端 需求&#xff1a;OpenFeign配置自定义decode&#xff0c;解析http请求返回的时间字符串 1.自定义反序列化器 Date 自定义反序列化器 import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.j…

java程序设计2(二)

自动装箱和自动拆箱&#xff1a;基本数据类型和包装类型之间可以直接相互转换的包装类通常可以区分有效数据和无效数据&#xff0c;例如&#xff1a;0和nullString类 获取字符串的方式 【企业面试】 String str1 "hello"; 这种获取字符串的方式&#xff0c;在串池…

百度地图JavaScript API核心功能指引

百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口&#xff0c;它能够帮助您在网站中构建功能丰富、交互性强的地图应用&#xff0c;包含了构建地图基本功能的各种接口&#xff0c;提供了诸如本地搜索、路线规划等数据服务。百度地图JavaScript API支持HTTP和HT…

让 Win10 上网本 Debug 模式 QUDPSocket 信号槽 收发不丢包的方法总结

在前两篇文章里&#xff0c;我们探讨了不少UDP丢包的解决方案。经过几年的摸索测试&#xff0c;其实方法非常简单, 无需修改代码。 1. Windows 下设置UDP缓存 这个方法可以一劳永逸解决UDP的收发丢包问题&#xff0c;只要添加注册表项目并重启即可。即使用Qt的信号与槽&#…

【他山之石】Leading-Trim: The Future of Digital Typesetting:数字排版的未来 —— Leading-Trim

文章目录 【他山之石】Leading-Trim: The Future of Digital Typesetting&#xff1a;数字排版的未来 —— Leading-TrimHow an emerging CSS standard can fix old problems and raise the bar for web apps1. The problem with text boxes today2. How we got here: a histor…

MySQL基础大全(看这一篇足够!!!)

文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…

uniapp/HBuilder X引入weex报错weex is not defined

出现错误&#xff1a; ‍[⁠ReferenceError⁠]‍ {message: "weex is not defined"} 在www.iconfont.cn把想要的图标放进个人项目中并且下载css文件&#xff1a; 进入HBuilder自己创建的项目中添加一个目录common&#xff0c;添加一个文件free-icon.css 把刚才下载…