了解UML的人都知道UML中也有包的概念,包在UML中作用与面向对象编程语言中类似,它是管理对象的工具,也是解决对象同名冲突的手段。
在UML中,包的表示图形是一个左上角带标签的矩形,而包名可以标注于矩形中央(如下图所示,包名Package1位于矩形中央)或者左上角的标签之内。
将包名置于包图形中央时,通常会影响包中所包含内容的描画,因而在需要体现包中的内容时,通常将包名置于左上角的标签之中,如下图所示。该示例表示包Pacakge2中包含一个类Book及其实例myBook。
不同工具对包名显示位置的具体实现与支持会稍有差异,例如在下图中,包名被置于矩形左上角而非标签之中,虽然这种描画包图的方式一般也不会给阅读者带来困惑,但还是建议尽量使用标准的描画形式。
包中可包含的对象较多,除在上图中包含的类与类实例之外,诸如用例、时序图、活动图等UML对象均可隶属于某个包。事实上,如果我们在使用UML对象时如果不指定其隶属的包,则这些UML元素被认为隶属于一个默认包。
在不同的场景下,一个包中包含的元素可能只有一个,也可能有许多。当包中包含的元素比较多而其中部分元素需要描画的细节较多要占据较大的空间时,包图会变得巨大无比且难以描画和阅读。此时,UML为我们提供了两种方式解决问题。一种方式是在包图中以列表形式列出其所包含的元素,然后在包图外另外描述这些元素的细节;另一种方式是将在包图外描述细节的元素通过符号“⊕”与包图进行关联。这两种形式的包图分别如下所示:
在分析与设计中,一个良好的结构,应当使用不同层次的包对所有元素进行组织与管理,这就又引入了一个新的概念“子包”。顾名思义,子包就是存在于另一个包中的包。例如在下图中,包Package3中包含了一个名为Package4的子包。
通过上面的讲述,包在UML中的用法应当已经清楚了。但我们应进一步思考,包的本质是什么?包其实是一个命名空间,同一命名空间要求其元素具有唯一且可区分的名称,所以同一包下的元素不可以重名而不同包中的元素可以具有相同的名称。
(附:我们可以进一步思考,在UML中,除了包,还有哪些元素其实也是命名空间?)