第四章静态视图•一、类与关系•二、类图•三、对象图•四、包图类•类是任何面向对象系统中最重要的构造块。类是一种重要的分类器(Classifier),用来描述结构和行为特性的机制,它包括类、接口、数据类型、信号、组件、节点、用例和子系统。•类是对一组具有相同属性、操作、关系和语义的对象的描述。这些对象包括现实世界中的软件事物和硬件事物,甚至也可以包括纯粹概念性的事物,它们是类的实例。一个类可以实现一个或多个接口。结构良好的类具有清晰的边界,并成为系统中职责均衡分布的一部分。•类在UML中由专门的图符表达,是一个分成3个分隔区的矩形。其中顶端的分隔区为类的名字,中间的分隔区放类的属性、属性的类型和值(在UML符号表示中给出类的初始值),第3个分隔区放操作、操作的参数表和返回类型。一、类与关系关系•关系(Relationship)是事物间的联系。在类的关系中,最常用的4种分别为:依赖(Dependency),它表示类之间的使用关系;泛化(Generalization),它表示类之间的一般和特殊是关系;关联(Association),它表示对象之间的结构关系;实现(Realization),它是规格说明和其实现之间的关系。1.依赖(Dependency)•依赖是两个元素之间的关系,对一个元素(提供者)的改变可能会影响或提供消息给其他元素(客户)。也就是说:客户以某种方式依赖于提供者。在实际的建模中,类元之间的依赖关系表示某一类元以某种方法依赖于其他类元。•从语义上理解,关联、实现和泛化都是依赖关系,但因为他们有更特别的语义,所以在UML中被分离出来作为独立的关系。•在图形上,UML把依赖描述成一条有向的虚线,指向被依赖的对象。2.泛化(Generalization)•泛化是一般事物(称为超类或父类)和该事物的较为特殊的种类(称为子类)之间的关系,子类继承父类的属性和操作,除此之外通常子类还添加新的属性和操作,或者修改了父类的某些操作。泛化意味着子类的对象可以用在父类的对象可能出现的地方,但反过来则不成立。例如:电视可以分为彩色电视和黑白电视,电视也可以分为CRT电视、液晶电视、背投电视、等离子电视。这些都是泛化关系,只为观察事物的角度不一样。更简单的来说,泛化关系描述了类之间的isakindof(属于……的一种)的关系。•在图形上,泛化用从子类指向父类的空心三角形箭头表示。3.关联(Association)•关联是一种结构关系,它指明一个事物的对象与另一个事物的对象间的联系。也就是说,如果两事物间存在链接,这些事物的类间必定存在着关联关系,因为链接是关联的实例,就如同对象是类的实例一样。4.实现(Realize)•实现是规格说明和其实现间的关系。它表示不继承结构而只继承行为。大多少情况下,实现关系用来规定接口和实现接口的类或组件之间的关系。•接口是能够让用户重用系统一组操作集的UML组件。一个接口可以被多个类或组件实现,一个类或组件也可以有多个接口。•可以在两种情况下使用实现关系:第一,在接口与实现该接口的类间;第二,在用例以及实现该用例的协作间。二、类图类图(classdiagram)是描述类、接口、协作、以及它们之间关系的图。它是系统中静态视图的一部分,静态视图可以包括许多的类图。静态视图用于为软件系统进行结构建模,它构造系统的词汇和关系,而结构模型的视化就是通过类图来实现的。类图所包括的内容如下:(1)类(2)接口(3)协作(4)依赖、泛化、实现和关联关系类图的用途•类图是系统静态视图的一部分,它主要是用来描述软件系统的静态结构。该视图主要支持系统的功能需求,也就是系统要提供给最终用户的服务。当系统分析师以支持软件系统的功能需求为目的设计静态视图时,通常以下述3种方法之一使用类图。(1)对系统的词汇建模(2)对简单协作建模(3)对逻辑数据库模式建模类图建模技术1.对简单协作建模协同是软件系统的动态交互在软件系统的静态视图上的映射。协同的静态结构是通过类图表达出来的。在对类图的简单协同建模时,不仅要描述类的职责、结构和服务,还要强调类间的关系。在协同建模时,要遵循的策略包括:•(1)识别要模拟的机制。一个机制描述了被建模的部分系统的一些功能和行为,这些功能和行为是由类、接口等元素交互作用产生的。•(2)对每种机制,识别参与协作的类、接口和其他协作,并识别它们间的关系。•(3)通过协作的脚本,发现建模的模型是否有被遗漏和语义错误的地方,并更正错误。•(4)得出相应类的对象,并确定具体的属性和操作。2.对数据库模式建模在对软件系统进行建模时,不仅要定义系统的动态行为,还需要为动态行为所操作的数据指定相应的格式。传统的逻辑数据库建模工具“实体-关系(E-R)”图只针对数据,而UML的类图还允许对行为建模。在为数据库建模时,要遵循的策略包括:(1)在系统中确定的类,它的状态必须超过其应用系统生命周期。(2)创建包含这些类的类图,并把它们标记成永久的(persistent)。(3)展开这些类的结构信息,即详细的描述属性的细节,并注重关联和构造这些类的基数。(4)观察系统中的公共模式(如循环关联、一对一关联等),它们往往使物理数据库设计复杂化。如果必要,系统分析师需要创建简化逻辑结构的中间抽象。(5)考虑这些类的行为,扩充那些对于数据存储和数据完整性很重要的操作。(6)如果可能,用工具来把逻辑设计换成物理设计。三、对象图•在UML中,对象图(ObjectDiagram)是表示在某一时刻一组对象以及它们之间的关系的图。•对象图可以被看作是类图在系统某一时刻的实例。•在图形上,对象图由节点以及连接这些节点的连线组成,节点可以是对象也可以是类,连线表示对象间的关系。对象图建模对象图主要用来描述类的实例在特定时刻的状态。它可以是类的实例也可以是交互图的静态部分。对于组件图和部署图来说,UML可以直接对它们建模,组件图和部署图上分别可以包含部件或结点的实例。对象图的建模过程:(1)确定参与交互的各对象的类,可以参照相应的类图和交互图;(2)确定类间的关系,如依赖、泛化、关联和实现;(3)针对交互在某特定时刻各对象的状态,使用对象图为这些对象建模;(4)建模时,系统分析师要根据建模的目标,绘制对象的关键状态和关键对象之间的连接关系。四、包图包图由包和包之间的联系构成,它是维护和控制系统总体结构的重要建模工具。当对大型系统进行建模时,经常需要处理大量的类、接口、构件、节点和图,这时就有必要将这些元素进行分组,即把那些语义相近并倾向于一起变化的元素组织起来加入同一包,,这样方便理解和处理整个模型。同时也便于轻松地控制这些元素的可见性,使一些元素在包外可见,一些元素是隐藏在包内的。设计良好的包是高内聚、低耦合的,并且对其内容的访问具有严密的控制。包的名字•和其他建模的元素一样,每个包都必须有一个区别于其他与其他包的名字。模型包是名字是一个字符串,它可分为简单名(simplename)和路径名(pathname)。简单名是指包仅含一个简单的名称,路径名是指以包所位于的外围包的名字作为前缀的包名。•图形上,包是带有标签的文件夹。包拥有的元素•包是对模型元素进行分组的机制,它把模型元素划分成若干个子集。包可以拥有UML中的其他元素,包括类、接口、组件、节点、协作、用例和图,包甚至还可以包含其他包。•包的作用不仅仅是为模型元素分组。它还为所拥有的模型元素构成一个命名空间,这就意味着一个模型包的各个同类建模元素不能具有相同的名字,不同模型包的各个建模元素能具有相同的名字,因为它们代表不用的建模元素。在同一包内,不同种类的模型元素能够具有相同的名字,但可能会带来不必要的麻烦,不推荐这么做。包的可见性•包的可见性用来控制包外界的元素对包内元素的可访问权限,这一点和类的可见性类似。可见性可以分成3种。•(1)公有访问(public):包内的模型元素可以被任何引入了此包的其他包的内含元素访问。公有访问用前缀于内含元素名字的加号(+)表示。•(2)保护访问(protected):表示此元素能被该模型包在继承关系上后继模式包的内含元素访问。保护访问用前缀于内含元素名字的#号(#)表示。•(3)私有访问(private):表示此元素可以被属于用一包的内含元素访问。私有访问用前缀于内含元素名字的减号(-)表示。引入与输出•在UML里,引入一个包中的元素可以单向的访问另一个包中的元素。引入(import)关系用构造型的import来修饰。包中具有公有访问权限的内含元素称为输出(export)。泛化关系•和类间的泛化关系类似,包间也存在着泛化关系。包间的泛化关系也像类那样遵循替代原则,特殊包可以应用到一般包被使用的任何地方。包间还存在另一种关系:引入和访问依赖,用于在一个包引入另一个包输出的元素。标准元素•UML的扩充机制同样适用于包。可以使用标记值来增加包的新特性,用构造型来描述包的新种类。UML定义了5种构造型来为其标准扩充。它们分别是:虚包(facade)、框架(framework)、桩(stub)、子系统(subsystem)、系统(system)。包建模技术当为较复杂的系统建模时,使用包是非常有效的建模方法。包在很多方面与类相似,但是在对大系统模型时特别要注意区别包与类。类是对问题领域或解决方案的事物的抽象,包是把这些事物组织成模型的一种机制。包可以没有标识.因为它没有实例,在运行系统中不可见;类必须有标识,它有实例,类的实例(对象)是运行系统的组成元素。建立包图的具体的做法如下。(1)分析系统模型元素(通常是对象类),把概念上或语义上相近的模型元素纳入一个包。(2)对于每一个包,标出其模型元素的可视性(公共、保护或私用)。(3)确定包与包之间的依赖联系,特别是输入依赖。(4)确定包与包之间的泛化联系,确定包元素的多态性与重载。(5)绘制包图。(6)包图精化。