当前课程知识点:软件工程 > 第11章 软件系统设计 > 11.4 软件体系结构风格(二) > 讲授视频
层次化已经成为一种
复杂系统设计的普遍性原则
很多复杂软件的设计
从操作系统到网络系统
再到一般的应用
几乎都是以层次结构来建立的
在层次结构中
系统被分成若干层次
每一层次由一系列的构件所组成
层次之间存在接口
通过接口形成调用
和返回的关系
下层构件向上层构件提供服务
上层构件被看作是
下层构件的客户端
这是我们前面提到过的
安卓操作系统的例子
它被划分成Linux内核
系统运行库
应用框架和应用
四个层次
这是一个网络的分层模型
它包括物理 数据链路
网络 传输 会话 表示
和应用等层次
并且严格限定
某一层的构件
只能和同一层的对等实体
以及和它紧邻的下一层进行交互
客户机/服务器体系结构
是一种分布式的系统模型
它把应用程序的处理
分成了两个部分
一个是客户机
负责和用户进行交互
另一个是服务器
它为客户机提供服务
最早的分布式系统是两层的
一个是客户机
一个是数据库的服务器
后来发展成为三层结构
中间增加了一个应用服务器层
现在已经发展成为一个
多层的体系结构
两层的客户机服务器结构
也称为胖客户端模型
在这种系统中
数据库服务器
负责数据的管理
客户机实现应用逻辑
并和用户进行交互
具体的过程是这样的
用户在客户机的系统界面上
输入数据
并发出业务处理请求
客户机上的业务处理程序
接受请求 进行处理
在需要进行数据存取的时候
向服务器发出数据存取请求
服务器将执行数据库连接 查找
和存取的操作
并把结果进行返回
客户机的业务处理程序
处理完用户请求之后
在表示层上进行输出
两层结构的主要问题
在于客户端的负担过重
系统维护和升级比较困难
扩展性也不太好
与胖客户端相对应
还有一种瘦客户端
二者的区别在于业务逻辑
到底在客户端多一些
还是在服务器端多一些
如果客户端
执行大部分的数据处理操作
那么就是胖客户端
如果客户端具有很少
或者没有业务逻辑
那就是瘦客户端
针对两层结构的问题
人们提出了三层客户机
服务器结构
它把应用系统
分成表示层 功能层
和数据层三个部分
而且把这三层进行明确的分割
在逻辑上使其独立
其中表示层
是应用的用户接口部分
负责实现用户和应用之间的对话
业务逻辑层
实现应用程序的处理逻辑和规则
数据层实现对数据库的存储
查询和更新
在硬件部署时
三层结构的表示层
可以配置在客户端
功能层和数据层
分别放在不同的服务器上
这样就大大降低了
客户端的负荷
也减轻了系统维护和升级的成本
和工作量
在增加新的业务处理时
可以相应的增加
装有功能层的服务器
系统的灵活性
和伸缩性变得很强
特别是随着系统规模的加大
这种结构的优势
就变得更加明显
但是需要注意的是
三层结构中
各层之间的通息效率如果很低
即使分配给各层的硬件很强
系统在整体上
也达不到所要求的性能
所以在设计的时候
必须要慎重考虑
三层之间的通讯方法 频率
和数据量
随着互联网技术的发展
浏览器/服务器结构
也称B/S结构逐渐流行
它是三层C/S结构的一种实现
它的客户端就是浏览器
表示层负责处理客户端
所需要的展现逻辑
应用层负责所有的业务逻辑
数据层负责对数据库的操作
层次架构的基本思想
是把一个应用
分成多个逻辑层
其中每一层都有通用
或者特定的角色
这样做
可以使应用更易于扩展
在实际部署时
功能层并不一定只驻留在
同一台服务器上
数据层也是这样
如果功能层或者数据层
分布在多台服务器上
那么就形成了集群式的系统结构
许多C/S结构的应用系统
都是从数据库中检索数据
再展现给用户
在用户更改数据之后
系统再把更新的内容
存储到数据库中
具体实现的时候
数据存取逻辑
是和用户界面绑在一起的
这样可以提高应用程序的性能
但是这种做法是有问题的
一般来说
用户界面的更改
往往要比数据存取更加频繁
而且除了数据存取之外
应有程序的业务逻辑中
往往还会包含
很多其他的业务逻辑
显然
用户界面一旦更改
就会影响到数据存取逻辑部分
这样是不满足高内聚
低耦合的设计原则的
那么纯粹的B/S结构
能不能解决这个问题
由于用户界面
仍然需要显式地调用
功能层的业务逻辑
所以还是很难避免用户界面修改
导致业务逻辑修改这个问题
所以说
我们需要进一步改进这个结构
以保证各个部分可以单独修改
而不影响其他部分
我们先来分析一下
影响Web系统模块化的一些因素
在这种系统中
用户界面的更改
要比业务逻辑更加频繁
如果把两部分的代码
都放在用户界面中
那么每一次更改用户界面
就会引起业务逻辑的修改
有些情况下
应用程序会用不同的方式
来显示同一个数据
比如说用表格
各种图形等等
那么
与业务逻辑相比
用户界面的代码
对设备的依赖性就会更大
设计美观
而且有效的用户界面
和开发复杂的业务逻辑
往往需要不同的编程技能
可能需要不同的人来编写
而且
为用户界面创建自动化的测试
也要比业务逻辑更难 更耗时
为了解决上述问题
人们提出了
模型-视图-控制器结构
也称MVC结构
它是把应用程序的数据模型
业务逻辑和用户界面
分别放在独立的构件中
这种结构
是在传统的B/S体系结构基础上
加入了一个新的元素
控制器
由控制器来决定视图
和模型之间的依赖关系
这样用户界面的修改
就不会对数据模型
或者业务逻辑造成太大的影响
其中模型
用于管理应用系统的行为和数据
它在发生变化时
会通知视图
并且允许视图
查询它的当前状态
同时也允许控制器
访问在模型中封装的业务功能
视图负责模型内容的展现
控制器则是定义了
应用系统的控制行为
负责分派用户的请求
并且针对用户请求
选择相应的视图
现在我们来看一个
Web应用的执行过程
客户端发送一个HTTP请求
这个请求首先会进入到控制器
然后控制器去获取数据
把它封装成模型
最后再把模型传递到视图中
进行展现
这个过程存在下面一些问题
我们看到每一次请求
都要经过控制器 模型
视图这样一个流程
用户才能看到最终展现的界面
整个过程比较复杂
实际上
视图是依赖于模型的
也就是说
如果没有模型
视图是无法展现最终的效果
另外渲染视图的过程
是在服务端来完成的
最终呈现给浏览器的
是带有模型的视图页面
系统的性能无法得到很好的优化
为了使数据展现过程更直接
而且有良好的用户体验
我们需要对MVC模式进行改进
现在来看一种改进的方案
首先从浏览器发出AJAX请求
然后服务端接受这个请求
返回JSON的数据给浏览器
最后在浏览器中
进行界面的渲染
如果我们把浏览器这一端
视为前端
服务器视为后端的话
上面改进后的MVC模式
可以简化为前后端分离的模式
现在有一种REST的机制
可以实现这个模式
关于这一部分的内容
我们将在下一章
进行详细讲解
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)