《Java设计模式及实践》—1.4 统一建模语言简介
1.4 统一建模语言简介
统一建模语言(Unified Modeling Language,UML)可以帮助我们表示软件的结构:不同的模块、类和对象如何相互交互,以及它们之间的关系是什么。
UML经常与面向对象的设计结合使用,但它具有更广泛的适用范围。然而这超出了本书的范围,因此,下面我们将重点介绍与本书相关的UML功能。
在UML中,我们可以定义系统的结构和行为,并且可以通过图表可视化全部或者部分模型。有两种类型的图表:
结构图用于表示系统的结构。有许多类型的结构图,但我们只讨论类图。对象图、包图和组件图均类似于类图。
行为图用于描述系统的行为。交互图是行为图的子集,用于描述系统的不同组件之间的控制流和数据流。在行为图中,顺序图广泛用于面向对象的设计中。
类图是面向对象设计和开发阶段中使用最多的图类型。类图是一种结构图,用于说明类的结构及类之间的关系。如图1-1所示。
类图对于描述类在应用程序中的结构非常有用。大多数时候,仅仅查看结构就足以了解类如何交互,但有时这还不够。对于这些情况,我们可以使用行为图和交互图,其中顺序图用于描述类和对象的交互。让我们使用顺序图来显示Car对象和Vehicle对象如何在继承和多态示例中进行交互,如图1-2所示。
类之间的关系
在面向对象编程中,除了代表基本概念的继承关系之外,还有一些其他类关系可以帮助我们建模和开发复杂的软件系统:
泛化和实现
依赖
关联、聚合和组合
图 1-2
1.泛化
继承也被称为Is-A关系,因为从另一个类继承而来的类能够被当成父类来使用。
当一个类表示多个类的共享特征时,这称为泛化,例如,Vehicle是Bike、Car和Truck的泛化。类似地,当一个类表示一般类的特殊实例时,这称为特化,因此Car是Vehicle的特化,如图1-3所示。
在UML术语中,描述继承的关系称为泛化。
2.实现
如果说泛化是面向对象中继承概念对应的UML中的术语,则UML中的实现表示面向对象编程中类的接口实现。
我们假设创建了一个名为Lockable的接口,该接口仅由可以锁定的Vehicle实现。在这种情况下,为Car类实现Lockable的图1-3将如图1-4所示。
3.依赖
依赖是最通用的UML关系类型之一。它用于定义一个类以某种方式依赖于另一个类,而另一个类可能依赖于或不依赖于第一个类。依赖关系有时被称为Uses-A关系。
通常,在面向对象的编程语言中,依赖关系用于描述一个类在方法的声明中是否包含第二个类的参数,或者说它只是通过方法将第二个类传递给其他类,而不是使用方法来创建第二个类的实例。如图1-5所示。
图 1-4 图 1-5
4.关联
关联表示两个实体之间的关系。有两种类型的关联:组合和聚合。通常,关联关系由箭头表示,如图1-6所示。
5.聚合
聚合是一种特殊类型的关联。如果将继承看作Is-A关系,则可以将聚合视为Has-A关系。
聚合用于描述以下情况中两个或多个类之间的关系:一个类在逻辑上包含另一个类,但所包含的类的实例又可以独立于第一个类在其上下文之外生存,或者可以被其他的类所引用。例如,部门与教师间存在Has-A关系,每位教师必须属于部门,但如果部门不再存在,教师仍然可以处于活动状态,如图1-7所示。
图 1-6 图 1-7
6.组合
顾名思义,一个类是另一个类的组成部分就称两者间存在组合关系。这有点类似于聚合,不同之处在于当主类不再存在时,依赖类不再存在。例如,房子(House)由房间(Room)组成,但如果房子被销毁,房间就不再存在,如图1-8所示。
实际上,尤其是在具有垃圾回收器的Java等语言中,组合和聚合之间的界限并不是很清晰。对象不必手动销毁,当它们不再被引用时,它们会被垃圾回收器自动销毁。因此,从编码的角度来看,我们不需要真正关心处理的是组合还是聚合关系,但是如果我们想要在UML中有一个定义良好的模型,考虑这一点就很重要了。
- 点赞
- 收藏
- 关注作者
评论(0)