UML包图提供了表现UML元素分组的能力。包图中的主要元素是包、它们的可见性和它们的依赖关系。
基本概念:包表示法
包是什么?包可以直接理解为命名空间,文件夹,是用来组织元素的封装。而包图可以用来描述包的功能性的组织层
次。在面向对象的开发中,类基本是整个系统的基础构建块,随着系统的开发与成熟,类将会越来越多,包实际上就
是对类的分类后形成后的结构。
UML的包是包图中使用的两种主要表示法之一,另一种是依赖关系。包的表示法是一个左上角带有标签的矩形。如果
包中不包含其他UML元素,那么包的名称应该被放在矩形之内。
如:
此图例就是显示了一个无其他元素的包图。如果包含了一些元素,名称就应该被放在标签之内。
如下图:
基本概念:元素的可见性
访问包中的一组协作类(或者说包中的任何元素)提供的服务取决于单个元素的可见性,包括内嵌的包。(就是说,
我们看这个包图,如何知道这个包的作用,其实是靠包中元素的可见性来实现的),元素的可见性由包容的包所定
义,可以是公有的或私有的,这种定义既适用于被包容的元素,也使用于通过导入的元素。
包图中的元素种类:类,接口,构件,节点,协作,用例,甚至其他包和图……
可见性是从包容的包的角度来定义的,包其实是为它包含的元素提供命名空间。包其实就是文件夹,是目录。但是它
要求包内被包含的元素都有一个唯一的名称,至少是在同类型的其他元素范围内有唯一的名称。这也就意味着同一个
命名空间中,没有两个类是可以有相同的名称的。
通常具有公有可见性的元素,可以被认为是这个包的接口的一部分,因为这些元素是可以被所有其他元素所看见的。
而具有私有可见性的元素不能够被包容的包之外的元素看见。
在包图中,我们关于可见性做了如下定义:
公有(+) 对它所在的包(包括内嵌的包)以及外部的元素可见。
私有(-) 只对它所在的包可见。
受保护的(#) 对它所在包和内嵌的包可见,其他外部元素均不可见。
在一张图中,这种可见性表示法一般被放在元素名称的前面。如下图:
基本概念:依赖关系
一个元素具有适当的可见性,允许其他元素对它进行访问,那么就可以指向它的依赖关系,来表示这种访问。依赖关
系也是包图中的另一种主要表示法,依赖关系显示了一个元素依赖于另一个元素来实现它在系统中的责任。
在UML元素(包括包)之间的依赖关系是用一个虚线的开放箭头来表示的。箭头的尾部位于具有依赖性的元素一方
(客户)。箭头位于支持这种依赖的元素(提供者)。依赖关系可以标上标签,通过《》中包含依赖关系的类型(由
一个关键词来表示),强调元素间依赖关系的类型。包特有的依赖关系包括导入、访问和合并。由于包容的元素之间
的关系,从而导致了包间依赖关系包括跟踪、派生、精化、允许和使用。
包与包之间的依赖关系图:
包与包之间相互之间的元素存在依赖关系图:
如果两个包之间存在多个包容元素依赖关系,这些依赖关系会聚合为包层面的依赖关系。包层面的依赖关系可以用一
个关键词标签标出,放在《》中,表示类型。但是,如果包含的依赖关系是不同类型的。包层面的依赖关系就不提供
标签。
如下图:
基本概念:包图
可以作为包图的组成部分的元素:包表示法、元素可见性、依赖关系。包图是UML2.0结构图,它包含作为主要被展
现的UML元素的包,同时展示了包间的依赖关系。换个通俗的说法就是:包图用于展示包内的抽象,也展示包间的关
系。
包表示法可以用于展示许多不同建模元素的结构和包容关系,例如类。当然包也可以用于不属于结构图的UML图,如
组织用例。这样做的好处是可以在很大的系统中体现清晰性或划分工作。用包分组的元素通常应该是在某种意义上是
相关的。例如:它们是系统中的一个字系统,是系统某个方面的相关用例,或者是一些协作类……
决定如何对元素进行分包的判定条件,是利用包来组织系统存在着许多不同的方式,如按架构层、子系统、按用户
(针对用例)……,好的分包是松耦合、高内聚的。
也就是说,应该看到包内的元素有更多的交互,包间的元素有更少的交互。尽量不让泛化层次结构或聚合关系跨越包
的边界。用例的包含或扩展关系也不要跨过包的边界。
包组织用例图,如下:
一个命名空间中包含的每个元素都可以通过“包名:元素名”这样的限定名称来进行引用。元素属于不同的命名空间
(处于不同的包中),就可以由相同的名称。
高级概念:导入与访问
导入是一种公有的包导入,而访问是一种私有的包导入。对于导入来说,我们既可以看到导入包的元素,也可以看到
被导入的项;但对于访问来说,其他元素不能看到这些添加到导入包命名空间中的元素,这些被导入的项是私有的,
他们在进行访问的包之外是不可见的。
包导入与包访问最大的好处就在于,我们能够通过限定名称引用其他命名空间的公有元素。执行导入的包将被导入元
素的名称添加到它的命名空间中。但是,如果相同类型的被导入元素刚好与已有的元素同名,那么将不会成功添加到
执行导入的包的命名空间中。例外,如果从不同的命名空间中导入的相同类型的元素具有相同的名称,它们也不会添
加到执行导入包的命名空间中。
《import》标签,代表了公有的包导入;《access》标签,代表私有的包导入。
无限定的名称(常常被称为简单名称)是没有任何路径信息的名称,并没有告诉我们它位于模型的什么位置,在包
中,可以使用这种无限定的名称来访问以下元素:
包拥有的元素;
导入的元素;
外层包中的元素。
嵌套的包可以使用无限定的名称来引用外层包中的内容,而不论嵌套的层次有多少。但是如果外层包中相同类型的元
素具有和内层包中一样的名称,就必须使用限定名称。从外层包的角度来看,外层包需要导入它内嵌的包,然后才能
使用无限定的名称来引用它们的元素。
如下图:
包图绘制原则:
•最小化包之间的依赖,最小化每个包中的public、protected元素的个数,最大化每个包中private元素个数
•在建模时应该避免包之间的循环依赖,也就是不能够包含相互依赖的情况,对于这种情况应进行分析