【架构】分层架构 (Layered Architecture)
一、分层模型基础理论

1. 核心定义
分层架构(Layered Architecture)模型是一种常见的软件设计架构,它将软件系统按照功能划分为不同的层次,每个层次都有特定的职责和功能,层与层之间存在清晰的依赖关系。这种架构有助于提高软件的可维护性、可扩展性和可复用性。
常见分层结构
虽然不同的应用场景和系统可能会有不同的分层方式,但比较经典的是分为四层,分别为表示层、业务逻辑层、数据访问层和数据层。
分层架构的一个特性就是关注分离(separation of concerns)。在层中的组件只负责本层的逻辑。组件的划分很容易让它们实现自己的角色和职责,也比较容易地开发,测试管理和维护。
1. 表示层(Presentation Layer)
定义:也称为用户界面层(UI 层),是用户与系统进行交互的接口。它负责接收用户的输入,并将系统的处理结果展示给用户。
职责:提供友好的用户界面,处理用户的请求和操作,如页面渲染、事件处理等。
实现技术:在 Web 应用中,通常使用 HTML、CSS、JavaScript 等前端技术实现;在桌面应用中,可能使用 JavaFX、Swing(Java)、Windows Forms(.NET)等技术。
示例:在一个电商网站中,商品列表页面、购物车页面等都是表示层的一部分,用户可以通过这些页面浏览商品、添加商品到购物车等。
2. 业务逻辑层(Business Logic Layer)
定义:也称为领域层,是系统的核心层,负责处理业务逻辑和业务规则。它接收来自表示层的请求,调用数据访问层获取数据,进行业务处理,并将处理结果返回给表示层。
职责:实现系统的业务逻辑,如订单处理、用户认证、权限管理等。确保业务规则的一致性和正确性。
实现技术:可以使用各种编程语言和框架来实现,如 Java 的 Spring 框架、Python 的 Django 框架等。
示例:在电商系统中,当用户提交订单时,业务逻辑层会检查库存是否充足、计算订单总价、生成订单记录等。
3. 数据访问层(Data Access Layer)
定义:也称为持久化层,负责与数据库或其他数据存储系统进行交互,实现数据的增删改查操作。它将业务逻辑层的请求转换为对数据存储系统的具体操作。
职责:封装数据访问细节,提供统一的数据访问接口,提高数据访问的效率和安全性。
实现技术:使用数据库访问技术,如 JDBC(Java)、ADO.NET(.NET)、SQLAlchemy(Python)等。
示例:在电商系统中,数据访问层负责从数据库中查询商品信息、保存用户订单信息等。
4. 数据层(Data Layer)
定义:也称为数据存储层,负责存储系统的数据。可以是关系型数据库(如 MySQL、Oracle)、非关系型数据库(如 MongoDB、Redis)、文件系统等。
职责:提供数据的持久化存储,确保数据的安全性和完整性。
示例:在电商系统中,数据层存储了商品信息、用户信息、订单信息等。

- 注意每一层都是封闭的。这意味着Request必须经过每一层才能到达最底下一层。
- 这就是分层架构的另一个特征:层隔离(layers of isolation)。层隔离的概念意味着你对任何一层的改变都不会影响其它层。一个层的组件并不会了解其它层的实现,或者知道很少。
- 分层架构也很容易增加新的层。 比如你想将一些通用的服务重构成一个服务层,比如通用图片处理,远程账户审计等,可以在业务层下增加一个服务层。它不会对展示层造成影响,也不会改变持久层的代码。
- 因为每一层丢失封闭的,业务层不得不通过服务层访问持久层,这没有天理啊。 所以有时候你会创建一个开放的层。这意味着上一层可以绕过这一层直接访问下一层。

典型场景包括:
- OSI网络模型(物理层→应用层7层结构)
- J2EE经典分层(Web层→Service层→DAO层)
2. 核心原则
单向依赖:Layer N只能调用Layer N-1(严格分层)或更底层(宽松分层)
契约协议:层间通过标准化接口通信(如REST API、RPC接口)
同层自治:每个层级内部实现技术无关性(如DA层可替换MySQL为MongoDB)
二、分层模型技术演进
1. 传统企业级分层
相关文章:
【架构】分层架构 (Layered Architecture)
一、分层模型基础理论 模型是一种常见的软件设计架构,它将软件系统按照功能划分为不同的层次,每个层次都有特定的职责和功能…...
玩客云 IP查找
1.玩客云使用静态IP在不同网段路由器下不能使用,动态不好找IP地址 1.1使用python3 实现自动获取发送 import requests import os import socket# 从环境变量获取 PushPlus 的 token 和群组编码 PUSH_PLUS_TOKEN os.getenv("PUSH_PLUS_TOKEN") PUSH_PLU…...
Android - Handler使用post之后,Runnable没有执行
问题:子线程创建的Handler。如果 post 之后,在Handler.removeCallbacks(run)移除了,下次再使用Handler.postDelayed(Runnable)接口或者使用post时,Runnable是没有执行。导致没有收到消息。 解决办法:只有主线程创建的…...
MyBatis-Plus之通用枚举
MyBatis-Plus之通用枚举 前言 MyBatis-Plus中提供了通用枚举,简单来说就是将数据库中的某一字段的代替的含义转换成真实的含义将数据展示给用户,用户在存储时也会将真实值转换成代替的数字存入到数据库中。举个例子:用户性别在数据库中存储…...
基于Spring Boot的图书管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
如何在 VS Code 中快速使用 Copilot 来辅助开发
在日常开发中,编写代码往往是最耗时的环节之一。而 GitHub Copilot,作为一款 AI 编码助手,可以帮助开发者 自动补全代码、生成代码片段,甚至直接编写完整的函数,大幅提升编码效率。那么,如何在 VS Code 中快…...
12.1 Android中协程的基本使用
文章目录 前言1、导入依赖2、使用协程获取服务器中的数据2.1 定义请求回调结果的数据类2.2 网络请求 3、网络回调结构4、通过ViewModel处理网络请求数据 前言 在使用协程的时候一直没有一个具体的概念,只知道协程能够使得异步操作等同于同步操作,且不会…...
【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
【黑马点评优化】2-Canel实现多级缓存(RedisCaffeine)同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…...
php-fpm
摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI进程,提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器,提供了更好的php进程管理方式,可以有效的控制内存和进程,支…...
Python3测试开发面试题2
python的内存池机制 在Python中,内存管理是通过Python的内存管理器和C语言实现的,特别是依赖于CPython的实现。CPython使用一种名为“内存池”(memory pool)的技术来优化小对象(如小整数、短字符串等)的内…...
qt + opengl 给立方体增加阴影
在前几篇文章里面学会了通过opengl实现一个立方体,那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子: 1 环境光照(Ambient …...
Webpack,Vite打包的理解
Webpack 和 Vite 都是现代前端开发中常用的构建工具,用于打包和优化项目代码。尽管它们的目标相似,但在设计理念、工作方式和适用场景上存在显著差异。 Webpack Webpack 是一个模块打包工具,主要用于将多个模块(如 JavaScript、…...
Vue 3 30天精进之旅:Day 25 - PWA支持
一、引言 在前面的24天中,我们已经深入探讨了Vue 3的许多核心概念和高级特性。今天,我们将进入一个全新的领域——PWA(Progressive Web App)。PWA是一种现代Web应用程序的开发模式,它结合了Web和原生应用的优点&#…...
机器学习-生命周期
假如一个用户向银行申请贷款,银行该如何对这个用户进行评估?很明显,银行首先需要调查清楚该用户的资金储备情况和信用历史等,然后再决定是否向其放款。 整个机器学习生命周期如下图所示: 1、定义问题 在使用机器学习中的术语表…...
大道至简 少字全意 易经的方式看 缓存 mybatis缓存 rendis缓存场景 案例
目录 介绍 mybatis缓存 一级缓存 1.是什么 2.特点 3.场景 mybatis 二级缓存 1.是什么 2.特点 3.配置步骤 注意 一级缓存问题 二级缓存问题 扩展 1.MyBatis集成 Redis 2.直接使用Redis redis 缓存 一、String 字符串 二、Llst 列表 三、Hash 哈希 四、Set…...
如何使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈
使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈:详细分析与实战 在开发 Flutter 应用时,性能问题可能会导致用户体验下降,比如页面卡顿、掉帧、内存泄漏等。为了定位和解决这些问题,Flutter 提供了强大的性能监控工具…...
TS中Any和Unknown有什么区别
在 TypeScript 中,any 和 unknown 都是顶级类型(top types),表示可以是任何类型的值。但它们在使用和行为上有显著区别,主要体现在类型安全性和使用方式上。 1. any 类型 特点: any 是 TypeScript 中最宽松…...
【Mpx】-环境搭建项目创建(一)
一.概述 官方文档:https://mpxjs.cn/guide/basic/start.html mpxjs/cli文档: https://github.com/mpx-ecology/mpx-cli 二.脚手架安装&创建项目 2.1项目创建 //脚手架安装 npm i -g mpxjs/cli //创建Mpx项目 mpx create mpx-demo(项目名称) //安装依赖 np…...
PyQt加载UI文件
1.动态加载 import sys from PySide6 import QtCore,QtWidgets from PySide6.QtWidgets import * from PySide6.QtUiTools import QUiLoaderclass readfile(QWidget):def __init__(self):super().__init__()self.uiQUiLoader().load("test.ui",self) self.__c…...
Java面试第二山!《计算机网络》!
在 Java 面试里,计算机网络知识是高频考点,今天就来盘点那些最容易被问到的计算机网络面试题,帮你轻松应对面试,也方便和朋友们一起探讨学习。 一、HTTP 和 HTTPS 的区别 1. 面试题呈现 HTTP 和 HTTPS 有什么区别?在…...
拯救手机电池寿命:BatteryChargeLimit智能充电限制应用深度解析
拯救手机电池寿命:BatteryChargeLimit智能充电限制应用深度解析 【免费下载链接】BatteryChargeLimit 项目地址: https://gitcode.com/gh_mirrors/ba/BatteryChargeLimit 你是否经历过手机电池一年后续航能力大幅下降的困扰?BatteryChargeLimit正…...
2026届毕业生推荐的十大降AI率方案推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要想有效避开人工智能文本检测系统的精准辨认,对于生成的内容能够施行如下这一系…...
RT-Thread下MPU6050的I2C驱动避坑指南:从硬件连接到DMP解算全流程
RT-Thread下MPU6050的I2C驱动避坑指南:从硬件连接到DMP解算全流程 在嵌入式开发领域,姿态传感器已成为无人机、平衡车、VR设备等智能硬件的核心组件。MPU6050作为一款集成6轴运动跟踪的经典传感器,凭借其高性价比和丰富功能,在RT-…...
FPGA当交换机?基于10G Ethernet Subsystem主从模式实现多光口UDP转发实战
FPGA构建10G以太网交换机的核心技术解析与实现 在高速网络设备开发领域,FPGA正逐渐成为传统ASIC和商用交换芯片的有力替代方案。本文将深入探讨如何利用Xilinx 7系列FPGA的10G Ethernet Subsystem IP核,构建一个具备多端口数据交换能力的硬件平台。不同于…...
CosineGate技术:基于余弦相似度的动态路由优化
1. CosineGate技术解析:基于余弦相似度的动态路由革命在深度学习领域,残差网络(ResNet)已经成为现代计算机视觉系统的基石架构。然而,传统残差网络存在一个根本性的效率问题——无论输入数据是否需要,所有残差块都必须执行完整的计…...
淘宝 API 数据缓存策略:Redis 多级缓存 + 本地缓存的混合架构
一、前言在电商业务体系中,淘宝 API 是商品信息、订单数据、价格库存、用户权益等核心业务数据的主要获取来源。反向海淘、电商分销、第三方工具对接等场景下,会高频调用淘宝开放平台 API,而 API 调用存在调用频次限制、接口响应延迟、配额成…...
保姆级教程:手把手教你用示波器调试HDMI音频(从I2S信号抓取到ACR时钟恢复)
保姆级教程:手把手教你用示波器调试HDMI音频(从I2S信号抓取到ACR时钟恢复) 当你面对一台HDMI设备突然"失声"时,是否曾感到无从下手?作为硬件工程师,我们常常需要从最底层的信号层面寻找答案。本文…...
从DIY爱好者视角看ZEMAX:如何用软件‘打磨’你的第一块200mm F/5牛顿望远镜主镜
从DIY爱好者视角看ZEMAX:如何用软件‘打磨’你的第一块200mm F/5牛顿望远镜主镜 当深夜的天文爱好者决定亲手磨制一块200mm口径的牛顿望远镜主镜时,ZEMAX这个光学设计软件就成为了数字世界的"磨镜台"。不同于工业级光学设计,DIY场景…...
DS4Windows完整指南:如何在Windows电脑上完美使用PlayStation手柄玩游戏
DS4Windows完整指南:如何在Windows电脑上完美使用PlayStation手柄玩游戏 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾经想在Windows电脑上使用PlayStation手柄玩游…...
SageMath在数论研究中的应用:从素数判定到椭圆曲线
SageMath在数论研究中的应用:从素数判定到椭圆曲线 【免费下载链接】sage Main repository of SageMath 项目地址: https://gitcode.com/gh_mirrors/sag/sage SageMath是一个功能强大的开源数学软件系统,广泛应用于数论研究领域。它集成了众多数学…...
