包图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个大型系统中往往包含了数量庞大的模型元素,如何组织管理这些元素是一个十分重要的问题。包是一种常规用途的有效的组合机制。包类似于文件系统中的文件夹或者是目录结构,它是一个容器,用来对模型元素进行分组,并且为这些元素提供一个命名空间。UML中的一个包直接对应于Java中的一个包。在Java中,一个包可能含有其他包、类或者同时含有这两者。进行建模时,通常使用逻辑性的包,用于对模型进行组织。而包图是由包和包之间的联系组成的,它是维护和控制系统总体结构的重要建模工具。本章将详细介绍包图的各种概念、表示方法和实例应用。
1.包图的概念
1.1包图和包
当对大型系统进行建模时,经常需要处理大量的类、借口、构件、节点和图,这时就很有必要将这些元素进行分组,即把那些语义相近并倾向于一起变化的元素组织起来加入同一包中,这样便于理解和处理整个模型。同时也便于控制包中元素的可见性。
包图是描述包及其关系的图。与所有UML的其它图一样,包图可以包括注释、约束。通过各个包与包之间关系的描述,展现出系统的模块与模块之间的关系。图1是一个包图模型。包是包图中最重要的概念,它包含了一组模型的元素和图,如图1中的Package A和Package B就是两个包。
Package B
Package A
在面向对象软件开发的过程中,类显然是构建整个系统的基本元素。但是对于大型的软件系统而言,其包含的类将是成百上千,再加上类间的关联关系、多重性等,必然是大大超出了人们对系统的理解和处理能力。为了便于管理这些类,我们引入了“包”这种分组元素。在包中可以拥有各种其它元素,包括类、接口、构件、节点、协作、用例,甚至是其它子包或图。一个元素只能属于一个包。包的作用是:
1)对语义上相关的元素进行分组。如,把功能相关的用例放在一个包中。
2)提供配置管理单元。如,以包为单位,对软件进行安装和配置。
3)在设计时,提供并行工作的单元。如,在设计阶段,多个设计小组,可以同时对几个相互独立包中的类进行详细设计。
4)提供封装的命名空间,同一个包中,其元素的名称必须惟一。
2.包的表示
2.1包的表示法
UML中,用文件夹符号来表示一个包。包由一个矩形表示,它包含两栏。下面是最常见的几种包的表示法,如图2所示。
Syste
同其他的模型元素一样,每个包都必须有一个与其他包相区别的名称。包的名称是一个字符串,标识包名称的格式通常有两种:简单名(simple name)和路径名(path name)。其中,简单名仅包含一个名称字符串:路径名是以包处于的外围包的名字作为前缀并加上名称字符串。
例如,Rose 常用表示方法中,其包名UI 就是一个简单名。而包System.Web.UI 才是一个完整带路径的名称,表示UI 这个包是位于System.Web 命名空间中的。如图3所示。
2.3包的元素
在一个包中可以拥有各种其他元素,包括类、接口、构件、节点、协作、用例,甚至是其他包或图。这是一种组成关系,意味着元素是在这个包中声明的,因此一个元素只能属于一个包。
每一个包就意味着一个独立的命名空间,因此,两个不同的包,可以具有相同的元素名,但由于所位于的包名不同,因此其全名仍然是不同的。
在包中表拥有的元素时,有两种方法:一种是在第二栏中列出所属元素名,一种是在第二栏中画出所属元素的图形表示。
2.4包的可见性
像类中的属性和方法一样,包中的元素也有可见性。包内元素的可见性用来控制包外界元素访问包内部元素的权限。可见性可分为三种。
1)公有访问(public ):包内的模型元素可以被任何引入了此包的其他包的内含元素访问。公有访问用前缀于内涵元素名字的+号(+)表示。
2)保护访问(protected )此元素能被该模型包在继承关系上的后继模式包的内含元素访问。保护访问用前缀于内涵元素名字的#号(#)表示。
3)私有访问(private )此元素可以被属于同一包的内含元素访问。私有访问用前缀于内涵元素名字的—号(—)表示。
包内元素的可见性,标识了外部元素访问包内元素的权限。表5-1列出了可见性与访问权限的关系。
2.5包的构造型
为了表示包的新特性,用构造型来描述包的新特征。包的构造型有5种,它们分别是:虚包(facade)、框架(framework)、桩(stub)、子系统(subsystem)和系统(system),
3.包中的关系
包图中包之间的关系有2种:依赖关系、泛化关系。
3.1依赖关系
两个包之间存在依赖关系通常是指这两个包之间所包含的模型元素之间存在着一个和多个依赖。对于由对象类组成的包,如果这两个包的任何对象类之间存在着如何一种依赖,那么这两个包之间就存在着依赖关系。包的依赖关系同样是使用一根虚箭线来表示,虚箭线从依赖源指向独立目的的包,如下图所示。
图中,“飞机”包和“发动机包”之间存在依赖,因为“飞机”包所包含的任何类依赖于“发动机”包中所包含的任何类。没有发动机,飞机就不能正常工作,这是非常明显的道理。
依赖关系又可以分为4种。在依赖关系中,我们把箭尾端的包称为客户包,把箭头端的包称为提供者包。下面以上图5-4为例说明其语义。
1. 《use》关系
《use》关系是一种默认的依赖关系,说明客户包(箭尾端的包)中的元素以某种方式使用提供者包(箭头端的包)的公共元素,也就是说客户包依赖于提供者包。如果没有指明依赖类型,则默认为《USE》关系。
例如在图5-4中,有两个《USE》依赖,Client包将通过Server包来完成Order的存储,而Server包使用System.Data.SqlClient包来实现数据库的存储。
2. 《import》关系
《import》关系:最普遍的包依赖类型,说明提供者包的命名空间将被添加到客户包的命名空间中,客户包中的元素也能够访问提供者包的所有公共元素。
《import》关系使命名空间合并,当提供者包中的元素具有与客户包中的元素相同的名称时,将会导致命名空间的冲突。这也意味着,当客户包的元素引用提供者包的元