书摘:C 嵌入式系统设计模式 03
本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。
本系列描述我对书中内容的理解。
书中大量使用了 UML 表示法,因此需要理解最基本的 UML 表示法含义。
什么是 UML
UML 本身并非是用于程序设计的语言,它本质上是一种表示法。UML
(Unified Modeling Language),是统一建模语言的缩写,是一种由一整套图表组成的标准化建模语言。UML 主要使用图形符号来表示软件项目的设计,使用 UML 可以帮助项目团队沟通、探索潜在的设计和验证软件的架构设计。
UML 常见有九种图,借用《九种常见UML图(分类+图解)》这篇文章中的图来描述:
本书中用到的 UML
本书是讲解设计模式的,因此在本书中, UML 用来图形化地描述模式的 结构
和 行为
。这本书使用了 UML 的三种图:类图
、序列图
和 状态图
。
本文讲述类图。
类图
类图用于显示系统的结构。它通过显示 类
(class)、对象
(object) 和各种 关系
(relation)来实现这一点。
类
类
包含 数据
和 函数
,数据又称为属性(attribute),函数又称为操作(operation)。在嵌入式 C 中,类通常实现为包含属性的结构体。
下图展示的是一个类的元素:
图中的类有变量和函数。本书中的函数命名风格为:<Class_Name>_<Function_Name>,比如 SensorClass_getData()
。
对象
对象
是类的实例(instance)。也就是类创建出的变量。
如果一个类定义为 Class_1,它的一个对象名为:itsClass_1,则在 UML 图中这样表示:
关系
在 UML中,关系是指类之间的连接,用于描述类之间的交互和依赖关系。UML定义了多种关系类型,它们分别是:
- 关联(Association):表示类与类之间的连接,关联关系使一个类知道另外一个类的属性和方法。
- 泛化(Generalization):定义了一般元素和特殊元素之间的分类关系,与 C++ 和 Java 中的继承关系有些类似。
- 实现(Realization):将一种类与接口连接起来,其中接口只是行为的说明,真正的实现由类来完成。
- 聚合(Aggregation):聚合关系是关联关系的一种,是一种强关联关系,表示整体和部分之间的关系。
- 组合(Composition):一种强的聚合关系,表示类与类之间的强依赖关系,其中一个类的修改可能会影响另一个类。
- 依赖(Dependency):表示一个类依赖于另一个类的定义。依赖关系仅仅描述了类与类之间的一种使用与被使用的关系。
关联(Association)
UML 中的 关联
表示类与类之间的连接,关联关系使一个类知道另外一个类的属性和方法。在 UML 图中,关联关系用一条直线来表示。关联关系又可分为多种情况:
- 双向关联:默认情况下关联是双向的。
- 单向关联:类之间的关联也可以是单向的关联,用带一个箭头的实线表示。
- 多重性关联:表示一个类的对象和另一个类的对象之间的连接个数。
- 自关联:类的属性对象类型为类本身
例如老师、学生和选修课程之间,老师可以有多个学生,学生也可以有多个老师,他们是双向关联;一个学生可以选择多门课程,课程是个抽象的东西,它不能拥有学生,所以是单向关联,之间是 1:n 的关系。
注意,这里关联的箭头指向被拥有者,也就是学生拥有课程,学生知道课程的相关信息。
泛化(Generalization)
UML 中的 泛化
定义了一般元素和特殊元素之间的分类关系,与 C++ 和 Java 中的继承关系有些类似。在 UML 图中用实线空心箭头表示,箭头指向更通用的类(父类)。子类可以继承父类的特性,包括属性、操作和关系。泛化是一种 is-a
类型的关系。
面向对象编程中的 is-a
和 has-a
是两种重要的关系,它们描述了类与类之间的关联,is-a 描述了泛化,has-a 描述了聚合或组合。
- is-a 关系:
- 定义:is-a 关系描述了一个类是另一个类的特殊类型的关系。换句话说,它表示一个类是另一个类的子类。
- 示例:考虑一个“狗”类和“动物”类。狗是一种动物,所以“狗”类是“动物”类的子类。在这里,“狗”类和“动物”类之间存在is-a关系。
- UML 表示:在 UML 中,is-a关系通常用带空心三角形的实线箭头表示,箭头指向父类。
- has-a 关系:
- 定义:has-a 关系描述了一个类拥有另一个类的对象作为其成员变量的关系。
- 示例:考虑一个“电脑”类和一个“键盘”类。电脑有一个键盘,所以“电脑”类有一个“键盘”类的对象作为其成员变量。在这里,“电脑”类和“键盘”类之间存在 has-a 关系。
- UML 表示:在 UML 中,has-a 关系通常用带实心菱形的实线箭头表示,箭头指向成员变量所属的类。
泛化(is-a)的例子如下图所示,聚合/组合(has-a)的例子后面会讲到。
实现(Realization)
UML 中的 实现
关系是一种接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。在UML类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。
例如,汽车和船实现了交通工具,其类图如下所示:
聚合(Aggregation)
UML 中的聚合关系是一种整体与部分的关系。在聚合关系中,整体与部分可以分开,部分可以离开整体而独立存在。在 UML 类图中,聚合关系用带空心菱形的实线表示。箭头指向整体。
例如,一个电脑与键盘的关系就是一种聚合关系。电脑是一个整体,而键盘是电脑的一部分。我们可以将键盘从电脑中移除,而电脑仍然可以正常运行。
组合(Composition)
UML 中的组合关系是一种强依赖关系,表示整体与部分之间的强连接。在这种关系中,部分与整体共存,如果整体不存在,部分也不存在。在 UML 类图中,组合关系用带实心菱形的实线表示。箭头指向整体。
例如,一个公司与部门的关系就是一种组合关系。公司是一个整体,而部门是公司的一部分。如果公司不存在,部门也无法独立存在。
依赖(Dependency)
UML 中的依赖关系表示一个类依赖于另一个类的定义。这种关系通常发生在两个类之间,其中一个类使用了另一个类的某些功能或属性。在UML类图中,依赖关系通常用带箭头的虚线表示,箭头指向被依赖的类。
例如,考虑一个“汽车”类和一个“引擎”类。汽车类依赖于引擎类的某些功能,如启动引擎、加速等。在这种情况下,汽车类对引擎类有依赖关系,因为汽车的功能需要引擎的功能来实现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!