第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,…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
