第13章 层次式架构设计理论与实践
13.1 层次上体系结构概述
回顾一下软件体系结构的相关概念:
在一些层次系统中,除了一些精心挑选的输出函数外,内部的层接口只对相邻的层可见。
层次式体系结构是一个可靠的通用的架构,设计时要注意以下两点:
(1)要注意的是污水池反模式。
(2)需要考虑的是分层架构可能会让你的应用变得庞大。
13.2 表现层框架设计
13.2.1 表现层设计模式
1.MVC模式
(1)控制器(Controller):
(2)模型(Model):
(3)视图(View):

2. MVP模式
目前,MVP模式被更多地用在Android开发当中。
3. MVVM模式

13.2.2 使用XML设计表现层,统一Web Form与Windows Form的外观
13.2.3 表现层中UIP设计思想
- 导航和工作流控制:这些将不会出现的Ul中,但是经常因为要基于业务逻辑决定哪一个视图将被显示。这导致代码的不雅和难于管理。
- 导航和工作流改变:用传统的UI技术改变应用程序的界面(改变页面的顺序或者添加删除页面)是非常痛苦的。
- 状态管理:不管是在windows form还是在web form中,在视图间维护状态都是比较困难的。
- 保存当前交互的快照:你可能想保存一个交互的快照并且在别的地方(不同的时间,不同的地点)重新开始它。
13.2.4 表现层动态生成设计思想
简单理解:用XML把页面需要的元素(如按钮、文本框、图标等等)及元素的位置、属性等保存起来,然后通过DOM API读取这个XML,动态的生成网页。
一些现有的框架思想也是这样,比如权限具体到页面的按钮上。
13.3 中间层架构设计
13.3.1业务逻辑层组件设计
1.业务逻辑组件的实现类
2.业务逻辑组件的配置
配置信息。
13.3.2业务逻辑层工作流设计
13.3.3业务逻辑层实体设计
业务逻辑层实体具有以下特点:
- 业务逻辑层实体提供对业务数据及相关功能(在某些设计中)的状态编程访问。
- 业务逻辑层实体可以使用具有复杂架构的数据来构建,这种数据通常来自数据库中的多个相关表。业务逻辑层实体数据可以作为业务过程的部分I/O参数传递。
- 业务逻辑层实体可以是可序列化的,以保持它们的当前状态。例如,应用程序可能需要在本地磁盘、桌面数据库(如果应用程序脱机工作)或消息队列消息中存储实体数据。
- 业务逻辑层实体不直接访问数据库,全部数据库访问都是由相关联的数据访问逻辑组件提供的。
- 业务逻辑层实体不启动任何类型的事务处理,事务处理由使用业务逻辑层实体的应用程序或业务过程来启动。


将业务逻辑层实体表示为通用DataSet的优点如下。
- (1)灵活性。DataSet可以包含数据的集合,能够表示复杂的数据关系。
- (2)序列化。在层间传递时,DataSet本身支持序列化。
- (3)数据绑定。可以把DataSet绑定到ASP.NET应用程序和Windows窗体应用程序的任意用户界面控件。
- (4)排序与过滤。可以使用DataView对象排序和过滤DataSet。应用程序可以为同一个DataSet创建多个DataView对象,以便用不同方式查看数据。
- (5)与XML的互换性。可以用XML格式读写DataSet。
- (6)开放式并发。在更新数据时,可以配合使用数据适配器与DataSet方便地执行开放式并发检查。
- (7)可扩展性。如果修改了数据库架构,则适当情况下数据访问逻辑组件中的方法可以创建包含修改后的DataTable和DataRelation对象的DataSet。
将业务逻辑层实体表示为有类型的DataSet。有类型的DataSet是包含具有严格类型的方法、属性和类型定义以公开DataSet中的数据和元数据的类。 将业务逻辑层实体表示为有类型的DataSet的优点如下。
- (1)代码易读。要访问有类型的DataSet中的表和列,可以使用有类型的方法和属性。
- (2)有类型的方法和属性的提供使得使用有类型的DataSet比使用通用DataSet更方便。使
- 用有类型的DataSet时,IntelliSense将可用。
- (3)编译时类型检查,无效的表名称和列名称将在编译时而不是在运行时检测。
13.3.4业务逻辑层框架

13.4 数据访问层设计
13.4.1 5种数据访问模式
1.在线访问
在线访问是最基本的数据访问模式,也是在实际开发过程中最常采用的。这种数据访问模式会占用一个数据库连接,读取数据,每个数据库操作都会通过这个连接不断地与后台的数据源进行交互。
2.DataAccess Object

3.Data Transfer Object

4.离线数据模式
5.对象/关系映射(Object/Relation Mapping,O/R Mapping)
13.4.2 工厂模式在数据访问层应用
数据库有很多种,相应的每种数据库访问类也不同,可是实际开发中,同一个功能,遇到不同的数据库就要写一个专门的访问类,或者复杂点的系统需要抽取不同种类的数据库的时候,就比较尴尬,每种数据库都得配上个访问类,而且后期的维护也不好。
那怎么办呢?搞一个专门根据不同数据库访问的一个类或者一个组件,让它来代替我们对每个数据库写一个对应的访问类,而我们直接调用它不就好了。
这时候,利用工厂思想就可以实现。
工厂模式定义一个数据库访问接口,这个接口只包含要干啥而且是通用的工作,比如所有的数据库都有类型吧(oracle、sqlserver、mysql...)需要连接吧,都需要打开连接吧,都需要执行相应的语句吧,最后还得关闭连接吧等等这些。
用子类继承这个接口,在子类里具体实现要实例化的哪种数据库。
参考代码:
// 访问接口
public interface DataAccess
{
DatabaseType DatabaseTypelget;) //数据库类型
IDbConnection DbConnection{get;} //得到数据库连接
void Open(); //打开数库连接
void Close(); //关闭数据库连接
IDbTransaction BeginTransaction(); //开始一个事务
int ExecuteNonQuery(string commandText); //执行Sq1语句
DataSet ExecuteDataset(string commandText); //执行Sq1,返回DataSet
}
//子类实现代码
public sealed class MSSqlDataAccess :AbstractDataAccess
{
…//具体实现代码
}
public class oleDbDataAccess :AbstractDataAccess
{
…//具体实现代码
}
public class OracleDataAccess ;AbstractDataAccess
{
…//具体实现代码
}
再省点事偷个懒的,把这个自动切换功能给它加上
public sealed class DataAccessFactory
{
private DataAccessFactory(){}
private static PersistenceProperty defaultPersistenceProperty;
public static PersistenceProperty DefaultPersistenceProperty
{
get{return defaultPersistenceProperty;}
set{defaultPersistenceProperty=value;}
}
public static DataAccess CreateDataAccess(PersistenceProperty pp)
{
DataAccess dataAccess;
switch(pp.DatabaseType)
{
case(DatabaseType.MSSQLServer):
dataAccess = new MSSqIDataAccess(pp.ConnectionString);
break;
case(DatabaseType.Oracle):
dataAccess = new OracleDataAccess(pp.ConnectionString);
break;
case(DatabaseType.OleDBSupported):
dataAccess = new OleDbDataAccess(pp.Connectionstring);
break;
default:
dataAccesswnew MSSqlDataAccess(pp.Connectionstring);
break;
}
return dataAccess;
}public static DataAccess CreateDataAccess()
{
return CreateDataAccess(defaultPersistenceProperty);
}
}
切换数据库只要改变红色类型就行了。
13.4.3 ORM、Hibernate与CMP2.0设计思想
运用sql语句是需要一定的数据库知识门槛的,但是很多的开发人员并不具备这方面的知识储备,比如同样是取数据,有的人写的语句就0.01秒出结果,有的人写的需要1秒钟才出结果,如果不具备数据库方面的知识或者不够了解,那么还要花费大量的时间和精力来搞明白这些,这时候ROM思想诞生了,它们的作用就是让你像写代码一样操作数据库的语句,你只关心你的业务逻辑,至于与数据库打交道的(生成sql然后执行)让ORM来干。
ORM也是有缺点的,毕竟封装了一层比直接写语句效率低,但是随着ORM技术的发展,以及配合Cache技术等等,效率也是不错的。
13.4.4 灵活运用XML Schema
13.4.5 事务处理设计
13.4.6 连接对象管理设计
共享资源---连接池。
连接池简单理解:
建立、关闭数据库连接非常的消耗资源的,但是我们的应用访问数据库是很频繁的,这样不停的建立、关闭造成大量的资源损耗和浪费,
那怎么办呢?
搞一个共享的连接可以吧,连接一直开着不关闭,你用完了,我再用,我用完了它再用,这样共享连接就会减少很多的资源消耗。访问量上来了,那么一个连接共享就不够了,好吧,那么给这个应用100个连接足够了,那就系统初始化就自动建立了100个连接,这100个连接就组成了连接池(当然不代表连接池哈,连接池还得管理哪些连接用完了释放,哪些正在连接打标记等等),这个应用的所有对数据库的操作都从连接池里取连接用。
13.5 数据架构规划与设计
13.5.1数据库设计与类的设计融合
13.5.2数据库设计与XML设计融合
目前Web数据发展的多样化和复杂化,传统的数据库技术很难存储和管理所有的web数据了,而且XML有代替HTML趋势。
鉴于以上情况,存储数据开始考虑用XML与现有的数据库结合的方式。
13.6 物联网层次架构设计
13.7 层次式架构案例分析---看看即可
13.7.1电子商务网站(网上商店PetShop)
13.7.2基于物联网架构的电子小票服务系统
相关文章:

第13章 层次式架构设计理论与实践
层次式架构的核心思想是将系统组成为一种层次结构,每一层为上层服务,并作为下层客户。其实不管是分层还是其他的架构都是为了解耦,更好的复用,只要秉承着这种思想去理解一切都迎刃而解了。 13.1 层次上体系结构概述 回顾一下软件…...

FreeRtos进阶——消息队列的操作逻辑
消息队列(queue) 在不同的任务之间,如果我们需要互相之间通信,使用全局变量进行通信,是一种不安全的通信的方式。为保证线程安全,我们需要引入消息队列的通信方式。 粗暴的消息队列 为保证线程的安全&am…...

WordPress搭建流程
1. 简介 WordPress 是一个 PHP 编写的网站制作平台。WordPress 本身免费,并且拥有众多的主题可以使用,适合用于搭建个人博客、公司官网、独立站等。 2. 环境准备 2.1 WordPress 下载 WordPress 可以在 Worpress中文官网 下载(如果后续要将后台调成中文的话,一定要从中文…...

数据集004:跌倒检测数据集 (含数据集下载链接)
数据集简介: 该数据集为跌倒检测数据集,属于imageclassify任务,分为fall和nofall两大类,累计共1000张图片,均为人工标注 xml格式,可用于yolo训练。 数据集链接:跌倒检测数据集(1000…...

苹果与OpenAI合作在即:iOS 18中的ChatGPT引发期待与担忧
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

Android 逆向学习【2】——APK基本结构
APK安装在安卓机器上的,相当于就是windows的exe文件 APK实际上是个压缩包 只要是压缩的东西 .jar也是压缩包 里面是.class(java编译后的一些东西) APK是Android Package的缩写,即Android安装包。而apk文件其实就是一个压缩包,我们可以将apk文件的后…...

你对仲裁裁决不服怎么办?我教你四个狠招!
你对仲裁裁决不服怎么办?我教你四个狠招! 这个标题是什么意思呢?也就是说,当你(或用人单位)向劳动仲裁委提出仲裁申请后,但劳动仲裁结果没有维护你的权益,或者你不满意,…...
绿色智能:低代码开发在AI机器学习中的深度应用与实践案例
随着科技的飞速进步,软件开发的方式也在不断演变。其中,低代码开发作为一种新兴的编程方式,以其高效、便捷的特性受到了广泛关注。同时,AI机器学习技术的发展也为软件开发带来了新的可能。本文将简要介绍低代码开发的概念…...
《NoSQL数据库技术与应用》 文档存储数据库MongoDB
搜索 《NoSQL数据库技术与应用》 教学设计 课程名称:NoSQL数据库技术与应用 授课年级: 20xx年级 授课学期: 20xx学年第一学期 教师姓名: 某某老师 2020年5月6日 课题 名称 第2章 文档存储数据库MongoDB 计划学时 4 课时 内容 分…...

设置AXI主寄存器切片和AXI数据FIFO
设置AXI主寄存器切片和AXI数据FIFO 打开MHS文件,并为每个AXI主机设置启用寄存器切片/启用数据FIFO。到 确定正确的设置,使用下表中的信息搜索MHS。 进行搜索时,将<intf_name>替换为相关的BUS_INTERFACE名称。 例如,BUS_INTE…...

Golang协程和通道
文章目录 协程(goroutine)基本介绍GMP模型协程间共享变量 通道(channel)基本介绍channel的定义方式channel的读写channel的关闭channel的遍历方式只读/只写channelchannel最佳案例select语句 协程(goroutine࿰…...

Enable Full Line suggestions 启用全行建议
开启后效果如下: 直接提示可能要输入的参数...

Java 文件操作和输入输出流
在 Java 编程中,文件操作和输入输出流是非常常见和重要的任务,它们允许你读取和写入文件、处理数据流等。 文件操作概述 文件操作是指对文件进行创建、读取、写入、删除等操作的过程。在 Java 中,文件操作通常涉及到使用文件对象、输入输出…...

MyBatis中的Where标签:提升你的SQL查询效率
哈喽,大家好,我是木头左! 理解MyBatis的Where标签 MyBatis是一款优秀的持久层框架,它提供了许多强大的标签来帮助编写更优雅、高效的SQL语句。其中,<where>标签是使用频率极高的一个,它能够自动处理…...

Docker(三) 容器管理
1 容器管理概述 Docker 的容器管理可以通过 Docker CLI 命令行工具来完成。Docker 提供了丰富的命令,用于管理容器的创建、启动、停止、删除、暂停、恢复等操作。 以下是一些常用的 Docker 容器命令: 1、docker run:用于创建并启动一个容器。…...
自己动手写docker——Namespace
Linux Namespace linux Namespace用于隔离一系列的系统资源,例如pid,userid,netword等,借助于Linux Namespace,可以实现容器的基本隔离。 Namespce介绍 Namespace类型系统调用参数作用Mount NamespaceCLONE_NEWNS隔离…...

【前端学习笔记】HTML基础
HTML 一、HTML介绍1.HTML概念2.文档声明3.字符编码4. HTML标签5. HTML属性 二、标签1.meta标签2.语义标签3.布局标签4.列表5.超链接6.图片7.字符实体8.内联格式9.HTML 表格10.HTML 表单 三、HTML5新特性1. 本地存储2. Cookie3. 语义化标签4.多媒体元素5.表单增强6.Canvas7.SVG …...
JS Lab
如何用 JavaScript 在浏览器中弹窗如何在 JavaScript 中制作鼠标滑过按钮改变背景颜色如何在 JS 中点击按钮使数字增加如何在 JS 中循环打印多少次 HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title…...

Vue:快速上手
一、简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,…...
HTML并集,交集,子代,后代选择器
1,交集选择器 他们必须满足既是p又是.box的关系(直接连写,没有任何符号) p.box{color:red; } <div class"box"> 1 </div> <p class"box">2</p> <p>3</p> 2.并集选择器 将div,p,…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...