组合结构图
1.概述
UML中的组合结构图(Composite Structure Diagram)是一种静态视图,用来表示一个类元或协作的内部结构。
一个典型的组合结构图如图1所示,该图描述了一个船的内部构造,包含一个螺旋桨和发动机,两者之间通过传动轴连接。
图1. 组合结构图
2.基本表示符号
组合结构图的基本元素有部件、接口、端口以及连接器、协作和结构化类元。
2.1 部件(Part)
部件是类元的结构化成员,它描述了一个实例在该类元实例内部所扮演的角色,是一个类或者构件内部的组成单元。
例如,如果一个图包含一组图形元素,那么,这些图形元素就可以作为该图的部件。
在UML中,部件符号表示为类元中的一个矩形,如图2所示:
图2. 部件
2.2 端口(Port)
端口是类元与外部系统进行交互的纽带。
在UML中,端口符号表示为一个小长方形,如图3所示:
图3. 端口
2.3 接口(Interface)
接口是一种类元,它定义了一组操作,以及一些公共属性。
UML提供了多种方法表示接口,图4给出了接口的两种图形表示:
图4. 接口
用圆圈符号表示的接口,不显示任何接口操作。
类元所实现的接口,称为供给接口(Provided Interface)。
类元所需要的接口,称为需求接口(Required Interface)。
供给接口和需求接口如图5所示:
图5. 供给接口和需求接口
2.4 连接器(Connector)
连接器是一种端口之间的关联。
基本的连接器有:装配连接器(Assembly Connector)和委托连接器(Delegate Connector)。
两个内部部件之间的连接器是装配连接器。
在UML中,装配连接器有两种表示方式:1)直接使用一条实线连接两个不同端口来表示;2)使用供应接口和需求接口的连接来表示。
装配连接器如图6所示:
图6. 装配连接器
委托连接器用于定义组件的外部端口和接口的内部运作,在UML中,委托连接器表示为一个带有« delegate »关键字的箭头,如图7所示:
图7. 委托连接器
2.5 协作(Collaboration)
协作描述了一组结构,以及结构之间的交互。
在UML2中,协作被当成是类元的一种,并且具有类元的相关行为。
在UML中,协作用虚线椭圆形表示,椭圆上部显示协作的名称,下部显示协作细节,如图8所示:
图8. 带有内部细节的协作
协作细节也可绘制在协作外部,使用通信连接来约束它们。
这种情况下,不需要在类元内部指定角色名,相反,可以把角色名写在每个实例的通信连接上。
这时可以添加属性和操作,如图9所示:
图9. 细节在外部的协作
协作事件用来将协作连接到一个具体的操作或者类元上,以展示该协作是如何通过其他元素实现的。
当协作关联到一个操作或者类元时,就生成了一个协作事件。
协作事件可以看作协作的实例。
协作事件的符号为椭圆,命名方式为“事件名:协作类型”。
协作事件如图10所示:
图10. 带有两个Observer/Observable协作事件的协作
与“协作”有关的其他元素还包括:角色绑定(Role Binding)、代表(Represents)、发生(Occurrence)等。
角色绑定连接器可以用在与一个类元的协作中,用以实现该类元的角色,在UML中,
“角色绑定”表示为带有箭头和名字的虚线,如图11所示:
图11. 角色绑定连接器
代表连接器可以用在与一个类元的协作中,表示该类元拥有此协作。
在UML中,“代
表”表示为带有关键字«represents»的虚线箭头,如图12所示:
图12. 代表连接器
发生连接器可以用在与一个类元的协作中,用来说明该协作可以代表该类元。
在UML
中,“发生”表示为带有关键字«occurrence»的虚线箭头,如图13所示:
图13. 发生连接器
2.5 结构化类元(Structured Classifier)
结构化类元是一个包含了部件或者角色的类元,这些部件或者角色组成了该类元的数据结构,并实现了它的行为。
结构化类元如图14所示,Car类有两个部件,Engine和Wheel,一个Engine可以关联两个Wheel。
图14. 结构化类元
3.应用举例
图15. Fibonacci数列生成系统
组合结构图的一个典型应用就是Fibonacci数列生成系统。
如图15所示:“FibonacciSystem”类主要由一些部件组成。
可以看到,图中上层的部件包含有类元“FibonacciFunction”。
底层的三个部件在“FibonacciSystem”中的角色分别是:NMinus2变量、NMinus1变量和N变量。
第五个部分是类查看器,在运行时可以有0个或多个查看器,或一些具体的子查看器在工作。
在运行时实现这三个角色的类实例必须提供通过其V AR的端口实现的IVar接口。
“view”端口是一个非公开的端口,可以被“FibonacciSystem”实例用来访问可选实例。