类图和对象图
作者:互联网
概述
定义
类图(Class Diagram)是用于显示一组类、接口以及它们之间关系的图。
类图用于对系统中的各种概念进行建模,并描绘出它们之间的关系,主要通过系统中的类以及类之间的关系来描述系统的静态结构
。
主要模型元素:
- 类、
- 接口
- 关系(依赖、泛化、关联和实现)
- 其他:包、注解等。
注意
类图是最复杂的图
类图组成
类
类是对一组具有相同属性、操作、关系和语义的事物的抽象。
在UML中,类通常表示为一个三栏矩形,顶部显示类名,中间显示类的属性,底部显示类的操作。
名称(Name)
每个类都必须有一个区别于其他类的名称,类名部分不可省略。
名称的表示方法:
简单名:只是一个单独的名称,例如Student
路径名(限定名):在类名前面加上包的名称,例如java::awt::Rectangle和Office::Printer
类的命名规范要求:由字母、数字、下划线、汉字组成的惟一的字符串。
类的命名建议:
在实际应用中,采用大驼峰式(Upper Camel-Case)命名法:大写字母开头、大小写混合,每个单词首字母大写。
不能使用特殊符号,尽可能避免使用汉字和缩写形式。
尽可能使用业务领域中的术语,并尽可能明确、简短、无歧义,以便于开发人员与用户之间的相互理解和交流。
一般而言,类的名字是名词。
避免使用抽象、无意义的名词。
正体字说明类是可被实例化的,斜体字说明类为抽象类。
属性(Attribute)
属性是已被命名的类的静态特性,它描述了该特性的实例可以取值的范围。
属性是类的对象可能包含的数据或状态的抽象。
属性的表示语法:
[可见性] 属性名 [:类型] [多重性] [=初始值] [{特性串}]
可见性
描述该属性是否能被其他类引用。
操作(Operation)
操作是类的动态特性或行为特征,它是对一个对象所做的事情的抽象,并由该类的所有对象共享。
类的操作的表示语法:
[可见性] 操作名称 ( [参数列表] ) [:返回类型] [{特性串}]
返回类型
任意有效数据类型(系统类型、自定义类型、void)
注意: 括号不可省略
特性串
指定关于操作的特殊性质或约束,要放在{ }中。
UML定义了几种可以用于操作的特性:abstract(抽象)、static (静态) 、leaf (叶子) 、isQuery (查询) 、 sequence (顺序/返回多值且构成有序包) 、 ordered (返回多值且有序) 、 unique (返回多值且无重复)等;也可以自定义特性。
类的特殊类型(Type)
普通类是一个完善的功能类,可以直接产生实例化对象。除了常见的的普通类,还有一些特殊的类。
抽象类
模板类
关联类
抽象类
缺乏实现的操作称为抽象操作,包含抽象操作的类是抽象类。在UML中,将类名和操作名用斜体修饰来表示。
抽象类是不完整的,不能被直接实例化,不能创建一个属于抽象类的对象。
模板类
类的特殊类型—模板类(Parameterized Class)
模板类是指带有一个或多个未绑定的形式参数的类。
在编译时把模板参数绑定到不同的数据类型,从而产生不同的类。
模板可以根据占位符或参数来定义类,而不用说明属性、方法返回值和方法参数的实际类型。
使用带有<<bind>>
构造型的依赖关系,通过实际值代替占位符或参数即可创建新类。
对应概念:C++中的模板与Java中的泛型。
关联类
在应用当中,如果发现两个类之间具有多对多的关系,并且有些属性不属于关联两端任何一个类,则可以创建一个关联类。
具有类的特性的关联关系,称为关联类。
通过关联类可以进一步描述关联的属性、操作及其他信息。
实际上,关联类既是关联又是类,不仅象关联那样连接两个类,而且可以拥有类的特性——属性和操作。
关联类在UML中被表示为一个类符号,并通过一条虚线连接到关联路径。虚线上没有修饰内容。
类的构造型(StereoType)
分析类
<<boundary>>、<<entity>>、<<control>>
构造型分别表示三种分析类——边界类、实体类、控制类。
分析类代表系统的原型类,业务需求通过分析类逻辑化,形成概念模型。
分析类是跨越需求到设计实现的桥梁,在从业务需求向系统设计的转化过程中起到重要作用。
边界(Boundary)类
边界类位于系统与外界的交界处,承担系统与外界的信息交互功能。
如窗体、对话框、报表、与外部设备或系统交互的类等。
边界类可以通过用例确定,因为参与者必须通过边界类参与用例。
实体(Entity)类
实体类描述要保存到持久存储体中的信息。
类及其属性最终可能映射成数据库中的表以及字段。
实体类可以从现实中存在的客观事物,以及需要持久存放的信息两方面来发现。
接口
接口(Interface)是一个被命名的一组操作的集合,用于描述类或组件的一个服务。
接口主要定义操作签名,不包含属性和操作实现;实现留给实现该接口的类、构件或子系统去完成。
接口的所有内容都是公有的
。
使用接口是为了将规格说明和实现相分离。
分类
接口可分为供给接口和需求接口,分别表示为小圆和半圆;也可以表示为带有<<interface>>
构造型的类符号。
接口名称建议以大写字母“I”作前缀,与类相似,也有简单名和路径名两种形式。
接口经常用于对软件构件(Component)的接缝来建模。
关系
类与类之间的关系最常见,通常有3种:
- 关联(Association)
- 泛化(Generalization)
- 依赖(Dependency)
类与接口之间的关系,一般有两种: - 实现(Realization)-供给接口
- 依赖(Dependency)-需求接口
接口之间可以有关联和泛化关系,但较少用。
关联(Association)关系
定义
关联关系表示对象之间的结构关系,指出了一个事物的对象与另一个事物的对象之间的语义上的连接。
关联可以分为单向关联、双向关联。
关联关系靠近类的连接点被称为关联端,有名称、角色、可见性、多重性等特性。
种类
一元关联(自身关联)
一个类与自身的关联
二元关联
两个类之间的关联,最普通、最常用。
N元关联
是在3个或3个以上类之间的关联,用菱形向外引出关联路径。
不建议使用N元关联,大多数N元关联经过细致分析,都可转成二元关联 。
Rose、SU等工具不能直接表示N元关联;EA可以表示。
特性
除了连接类元素的关联路径之外,关联还有名称、角色、多重性、导航性、限定符等可选的特性。
名称
角色(role)
多重性(multiplicity)
构造型(stereotype)
导航性(navigation)
限定符(qualifier)
约束(constraint)
名称
一般使用一个动词或动词短语来命名关联,还可以在关联上标识阅读方向指示符,以消除阅读的歧义。
角色
是指在关联关系中,一个类通过关联对另外一个类所表现出来的职责。
如果在关联上没有标出角色名,则隐含的用类名作为角色名。
多重性
是指在关联关系中,一个类的一个实例与另一个类的多个实例相关。
多重性表示形式:minimum..maximum
分类
1:1 和 1:n 和 m:n
构造型
在关联关系中,也可以根据具体的语义设置一些构造型。
导航性
导航性根据方向不同,分为单向关联和双向关联。
限定符(qualifier)
限定符定义了被参考对象的一个属性,并可以将该属性作为直接访问被参考对象的关键字。
当需要使用某些信息作为关键字,来识别对象集合中的一个唯一对象时可以使用限定符,使用限定符的关联被称为受限关联。
限定符会影响关联的多重性。
解决查找问题
泛化(继承)关系
含义
继承
指一个类继承另一个类的属性和操作;
泛化
泛化就是指一般化的过程。
箭头:子类指向父类
例如:
可以描述为:
- Horse类继承Mammal类
- Mammal类泛化Horse类
一般描述的类被称作父类,特殊描述的类被称作子类。
泛化关系描述的是“is a kind of”的关系。
接口之间也可以存在泛化关系(子接口与父接口)。
继承的识别
泛化关系特点:
特殊事物完全符合一般事物;
在一般事物出现的地方,能够替换成特殊事物;
通过从特殊事物泛化或从一般事物特化可以创建泛化层次。
泛化可能跨越多个层次。一个子类的父类也可以是另一个父类的子类。
用途
自底向上的实例替换。可以使得子类的实例用于任何父类被声明使用的地方,实现多态。
尽管每个子类的
实现方法不同,
但外界调用方式
完全一样。
自顶向下的成员继承。可以让子类共享父类的属性和操作,实现继承。
public、protected属性和操作可被继承。
继承的方式有两种:单继承( C#、Java )和多继承(C++)。
小结
依赖和实现
类与接口可构成(依赖和实现)关系。
依赖关系
依赖表示两个类之间或类与接口之间的使用关系。
类A使用类B的信息和服务,并且提供者类B的变化可能会影响到客户类A。
分类
- 客户类的操作使用提供者类的对象
- 客户类的操作调用提供者类的操作
- 客户类的操作需要提供者类的参数
- 客户类的操作返回提供者类的对象
B类依赖于A类的常见原因:
- A类是B类某数据成员的类型
- A类是B类某方法中的局部变量或参数的类型
- A类向B类发送消息,从而影响B类发生变化
表示
public class Train{
public void move(){}
}
public class Person{
public void move(Train train){
train.move();
}
}
类图表示为
依赖者-->被依赖者
实现关系
实现关系用来表示规格说明与实现之间的关系。
在类图中,实现关系主要用于接口与实现该接口的类之间。
一个类可以实现多个接口,一个接口也可以被多个类实现。
实现关系的两种表示法:
-
当接口以带构造型的类符号表示时,用虚线三角箭头表示。
-
当接口元素以小圆圈方式表示时,用实线表示。
约束
小结
聚合和组合
关联关系有两种非常重要的特殊形式:
聚合(Aggregation)关系
组合(Composition)关系
用于表示整体与部分的关系
聚合关系
聚合(聚集)描述的是部分和整体关系的关联,描述了“has a”的关系。
部分可独立于整体而存在,是松散
的关联关系。
聚合(聚集)就像计算机和它的外围设备:
计算机只是很松散地和外部设备关联;
外围设备可有可无;
外围设备可以被其它计算机所共享。
表示
组合关系
组合(组成)关系是更强形式的聚合,描述了“contains a”的关系。
整体与部分一般具有同样的生存期,部分完全依赖于整体。
整体唯一地负责处理它的部分,包括创建和销毁。
组合(组成)就像是树和树叶:
一片树叶只能被一棵树所拥有;
一片树叶不能由几棵树所共享;
当树死去时,它的树叶也随之死去。
要求
不允许部分类游离于整体之外。
表示
异同点:
都是描述部分与整体关系的特殊关联。
聚合松散,组合紧密。
一个部分事物对象可以属于多个聚合对象,但一个部分事物对象仅能属于一个组合对象。
聚合的对象生命周期可以不同,但组合对象则是同存同亡。
标签:关系,泛化,对象,类图,接口,关联,操作,属性 来源: https://www.cnblogs.com/kingwz/p/16649371.html