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