13. 层次式架构设计理论与实践
1 层次式体系结构概述
软件体系结构
- 定义
- 定义:为软件系统提供结构、行为和属性的高级抽象。
- 元素相互作用:指导元素集成的模式以及这些模式的约束组成。
- 重要性
- 指导系统开发:软件体系结构是系统开发早期设计决策的体现。
- 影响系统后续开发:部署和维护具有重要影响。
- 特点
- 系统级抽象:关于系统的造以及系统各个元素工作机制的相对较小、却又能够反映问题的模型。
- 促进大规模软件系统复用。
层次式架构
- 是软件体系结构设计中最为常用的一种架构形式,也被叫作 N 层架构模式 (n-tier architecture pattern)。
- 层次式架构设计将系统组织成多层,每一层为上层服务,并作为下层客户。
- 分层架构本身没有规定要分成多少层,大部分的应用会分成表现层(或称为展示层)、中间层(或称为业务层)、数据访问层(或称为持久层)和数据层。
- 分层的一个特性就是关注分离(separation of concerns)。
层次式架构的优缺点
- 优点
- 简化设计:简化了系统的设计和实现。
- 提高可维护性:便于修改和维护。
- 缺点
- 可能引起性能问题:分层架构可能会让应用变得庞大。
- 增加复杂性:分层可能会带来一些潜在的问题。
结论
- 层次式架构是一种常见的架构模式,适合传统的 IT 项目和组织结构。
- 随着技术的发展,层次式架构也在不断地发展中。
2 表现层框架设计
2.1 表现层设计模式
2.1.1 MVC 模式
MVC 是一种流行的软件设计模式,近年来随着 Java EE 的成熟,MVC 成为了 Java EE 平台上推荐的一种设计模式。
MVC 强制性地把一个应用的输入、处理、输出流程按照视图、控制、模型的方式进行分离,形成了控制器、模型、视图三个核心模块。
- 控制器(Controller):接收用户输入并调用模型和视图去完成用户的需求。
- 模型(Model):应用程序的主体部分,表示业务数据和业务逻辑。
- 视图(View):用户看到并与之交互的界面,显示相关的数据,并能接收用户输入的数据。
2.1.2 MVP 模式
MVP 模式是经典的模式,与 MVC 演变而来,基本思想有相通的地方。
- Controller/Presenter 负责逻辑的处理,Model 提供数据,View 负责显示。
- View 和 Controller 不能直接进行“交流”。所有的交互都发生在 Presenter 内部
2.1.3 MVVM 模式
MVVM 模式是为解决 MVP 中 UI 种类变多,接口也会不断增加的问题而提出的。
- ViewModel:用于数据转换的控制器,将命令从视图携带到对象。
- View 和 ViewModel 之间使用 DataBinding 技术事件进行通信。
结论
- MVC、MVP 和 MVVM 模式都是表现层设计的有效模式。
- 选择合适的模式可以提高应用的可扩展性、健壮性及灵活性。
2.2 使用 XML 设计表现层,统一 Web Forms 与 Windows Form 的外观
XML 与 HTML 类似
- XML 被公认为是优秀的数据描述语言,并且成为了行业广泛采用的数据描述标准。
- XML 描述数据并集中于数据的内容,HTML 类似,但 HTML 很少采用 XML 作为表现层技术。
XML 控件组成
- XML 控件可以看成是一个数据对象,包含位置信息、类型和绑定的事件等。
- XML 描述控件属性,如 type=“button”,type=“panel” 等。
2.3 表现层中 UIP 设计思想
UIP(UserInterface Process Application Block) 是微软社区开发的众多Application Block 中的其中之一,它是开源的。 UIP 提供了一个扩展的框架,用于简化用户界面与商业逻辑代码的分离的方法,可以用它来写复杂的用户界面导航和工作流处理,并且它能够复用在不同的场景、并可以随着应用的增加而进行扩展。
2.4 表现层动态生成设计思想
基于 XML 的界面管理技术
- 用 XML 生成配置文件及界面所需的元数据,按不同需求生成界面元素及软件界面。
- 包括界面配置、界面动态生成和界面定制三部分。
界面配置
- 对用户界面的静态定义,通过读取配置文件的初始值对界面配置。
- 系统读取 XML 配置文件的表示层信息,运行时动态生成界面。
3 中间层架构设计
3.1 业务逻辑层组件设计
业务逻辑组件分为接口和实现类两个部分。
3.1.1 业务逻辑组件的实现类
- 业务逻辑组件以 DAO(Data Access Object) 组件为基础,必须接收 Spring 容器注入的 DAO 组件。
- 业务逻辑组件的实现类将 DAO 组件接口实例作为属性(面向接口编程)。
3.1.2 业务逻辑组件的配置
- 业务逻辑组件的 DAO 组件未被初始化,由 Spring 的反向控制(IoC)或依赖注入(DI)机制完成。
- 需要在 applicationContext.xml 里面配置 FacedeManager 组件。
3.2 业务逻辑层工作流设计
工作流管理联盟(Workflow Management Coalition)定义工作流为:业务流程的全部或部分自动化。
3.3 业务逻辑层实体设计
XML表示业务逻辑层实体
- XML 用于表示业务逻辑层实体,具有标准支持、灵活性和互操作性。
DataSet 表示业务逻辑层实体
- 通用 DataSet:灵活、可序列化、支持数据绑定和过滤、易于与 XML 互换。
- 有类型 DataSet:代码易读、类型安全、编译时检查。
优点总结
- 灵活性:能表示复杂数据关系。
- 互操作性:易于与外部系统交换数据。
- 数据绑定:支持与用户界面控件绑定。
- 排序与过滤:支持数据的排序和过滤。
- 可扩展性:易于适应数据库结构变化。
3.4 业务逻辑层框架
3.4.1 业务逻辑层框架概述
业务框架位于系统架构的中间层,是实现系统功能的核心组件。采用容器的形式,便于系统功能的开发、代码重用和管理。
3.4.2 业务逻辑层框架实现
在业务逻辑中,业务逻辑是按照 Domain Model—Service—Control 思想实现的。
- Domain Model:领域层业务对象,包含业务相关的属性。
- Service:业务过程实现的组成部分,应用程序的不同功能单元。
- Control:服务控制器,负责服务之间的切换,提高灵活性和重用性。
3.4.3 Domain Model—Service—Control 交互关系
以下是 Domain Model—Service—Control 三者的交互关系:
- Service 的运行会依赖于 Domain Model 的状态,反之,Service 也会根据业务规则改变 Domain Model 的状态。
- Control 作为服务控制器,根据 Domain Model 的状态和相关参数决定 Service 之间的执行顺序及相互关系。
- Domain Model—Service—Control 的互动关系,使程序具备高度的可重用性和灵活性。
4 数据访问层设计
4.1 5 种数据访问模式
4.1.1 在线访问
在线访问是最基本的数据访问模式,占用数据库连接,读取数据。
4.1.2 Data Access Object
- DAO 模式是标准 J2EE 设计模式之一,用于将底层数据访问操作与高层业务逻辑分离。
- DAO 接口:定义数据访问操作。
- DAO 实现:具体实现数据访问逻辑。
- 数据传输对象:用于传输数据。
4.1.3 Data Transfer Object
- DTO 用于在进程或网络间传输数据,不包含业务逻辑。
- DTO 模式:简化数据传输,提高性能。
4.1.4 离线数据模式
- 离线数据模式以数据为中心,数据从数据库获取后,按照预定义的结构存储。
- 数据库:ADO.NET 或其他数据库访问技术。
4.1.5 对象/关系映射 (Object/Relation Mapping, O/R Mapping)
O/R Mapping 提供工具或平台,将数据转换成对象或关系型数据库记录。
4.2 工厂模式在数据访问层应用
工厂模式概述
在应用程序设计中,数据库访问需要良好的封装性和可维护性。工厂模式用于创建对象的接口,子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
定义访问接口
定义一个访问接口 DataAccess
,包含以下方法:
DatabaseType DataType{get;}
IDbConnection DbConnection{get;}
void Open();
void Close();
IDbTransaction BeginTransaction();
int ExecuteNonQuery(string commandText);
DataSet ExecuteDataSet(string commandText);
实现具体类
实现 AbstractDataAccess
类,包含公共方法:
public sealed class MSSqlDataAccess : AbstractDataAccess
public class oleDbDataAccess : AbstractDataAccess
public class oracleDataAccess : AbstractDataAccess
创建 Factory 类
创建 DataAccessFactory
类,实现自动数据库切换的管理:
- 根据数据库类型返回适当的数据库操纵类。
- 使用
PersistenceProperty
属性设置数据库连接字符串。
使用 Factory 类
客户端代码调用 DataAccessFactory.CreateDataAccess()
创建 DataAccess
实例,执行数据库操作。
4.3 ORM、Hibernate 与 CM 2.0 设计思想
ORM 映射
- ORM (Object-Relation Mapping) 在关系型数据库和对象之间作一个映射。
- ORM 框架把数据表转换成对象,简化数据库操作。
CMP2.0 设计思想
- CMP 2.0 (Container Managed Persistence) 由 EJB 规范定义。
- CMP 2.0 将数据持久化逻辑从业务逻辑中分离,减少编码。
4.4 灵活运用XML Schema
XML Schema 简介
- XML Schema 描述 XML 文档合法结构、内容和限制。
- XML Schema 定义 XML 文档的结构和数据类型。
XML Schema 组成
- XML Schema 由三部分组成:XML Schema 命名空间、元素声明和属性声明。
- 基本组件包括:简单类型定义、复杂类型定义、元素声明、属性声明、模型组和符号空间。
4.5 事务处理设计
4.5.1 JavaBean 中使用 JDBC 方式进行事务处理
- 在 JDBC 中,可以通过手动管理事务,使用
setAutoCommit(false)
禁用自动提交,然后调用commit()
提交事务。 - 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public int delete(int sID) {
DataBaseContext dbc = new DataBaseContext();
Connection con = dbc.getConnection();
try {
dbc.executeUpdate("delete from bylaw where ID="+sID);
dbc.executeUpdate("delete from bylaw_content where ID="+sID);
dbc.executeUpdate("delete from bylaw_affix where bylawid="+sID);
con.commit();
con.setAutoCommit(true);
dbc.close();
return 1;
} catch(Exception exc) {
transaction.rollback();
exc.printStackTrace();
dbc.close();
return -1;
}
} - 事务处理设计中,JDBC 事务的默认提交方式为自动提交,需手动关闭。
4.5.2 SessionBean 中的 JTA 事务
- JTA 是事务服务的 J2EE 解决方案,通过 UserTransaction 接口管理事务。
- 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public int delete(int sID) {
DataBaseContext dbc = null;
dbc = new DataBaseContext();
dbc.getConnection();
UserTransaction transaction = sessionContext.getUserTransaction();
transaction.begin();
try {
dbc.executeUpdate("delete from bylaw where ID="+sID);
dbc.executeUpdate("delete from bylaw_content where ID="+sID);
dbc.executeUpdate("delete from bylaw_affix where bylawid="+sID);
transaction.commit();
dbc.close();
return 1;
} catch(Exception exc) {
try {
transaction.rollback();
}
catch(Exception ex) {
// JTA 事务回滚出错处理
ex.printStackTrace();
}
exc.printStackTrace();
dbc.close();
return -1;
}
} - JTA 事务管理中,UserTransaction 接口用于控制事务的开始、提交和回滚。
4.6 连接对象管理设计
连接池概念
- 连接池用于管理数据库连接,避免频繁创建和销毁连接,提高性能。
- 静态池:预先创建连接并放入池中,动态池:根据需求创建连接。
连接池实现
- Java 提供多种容器类实现连接池,如 Vector、Stack 等。
- 连接池管理策略包括标记空闲连接、分配和释放连接。
5 数据架构规划与设计
5.1 数据库设计与类的设计融合
- 数据库设计和类设计是数据模型的关键所在。
- 数据模型的识别和描述是艺术,没有唯一解决方案。
- 好模型的目标是将工程项目整个生存期内的花费减至最小,同时考虑系统迁移和变化。
13.5.2 数据库设计与XML设计融合
-
XML 是数据描述和交换的标准,用于替代 HTML 成为 Web 存储数据的主要格式。
-
XML 文档分为两类:文档中心的文档和数据为中心的文档。
-
XML 存储方式包括基于文件的存储和数据库存储。
-
基于文件的存储方式:
- 存储技术包括操作系统文件库、通用文件管理系统和面向对象的数据库。
- 特点:获取 XML 文档结构简单,但查询困难。
-
数据库存储方式:
- 管理方便、存储空间小、检索速度快。
- 能管理结构化和半结构化数据,具有索引和查询能力。
在某种程度上, XML 及其一系列相关技术就是一个数据库系统。它提供了传统数据库所具有的特点,如存储(以 XML 文档形式)、数据库的模式 ( DTD 或 XMLSchema)、 查询语言(XQuery、XPath、XQL 和 XML-QL 等)和编程接口(如 SAX 、 DOM ) 等。
6 物联网层次架构设计
- 感知层
- 感知层用于识别物体、采集信息,包括二维码标签、RFID 标签和读写器、摄像头、GPS、传感器等。
- 感知层解决的是物理世界的数据获取问题,通过传感器、数码相机等设备采集外部物理世界的数据。
- 网络层
- 网络层用于传输信息和处理信息,包括通信网与互联网的融合网络、网络管理中心和智能处理中心等。
- 网络层解决的是传输和处理感知层所获得数据的问题,通过移动通信网、互联网、企业内部网等进行传输。
- 应用层
- 应用层实现产业智能化,结合行业需求实现行业智能化。
- 物联网应用层利用经过分析处理的感知数据,为用户提供丰富的特定服务。
- 应用层解决的是信息处理和人机交互的问题,涵盖国民经济和社会的各个领域。
总结
- 物联网是泛指应用各种程序相连的设备和系统,为用户带来丰富多彩的物联网应用。
- 物联网的发展将推动物联网产业的繁荣,给整个产业链带来丰厚的回报。
7 电子商务网站(网上商店PetShop)
7.1 电子商务网站PetShop
PetShop 是一个范例,展示 .Net 企业系统开发的能力。随着版本的更新,PetShop 架构与代码不断优化。
PetShop 基于 .Net 2.0,采用 B/S 系统架构。数据访问层(DAL)通过接口与业务逻辑层交互。
7.2 基于物联网架构的电子小票服务系统
电子小票物联网架构
采用感知层、网络层和应用层的三层物联网体系架构模型。
电子小票服务系统架构
系统由小票智能硬件、商家收银机、电子小票云平台、微信公众平台、消费者智能手机和商家 PC 终端构成。