一、类图与对象图概述
(一)类图
1.类:类是对一组具有相同属性、操作、关系和语义的对象的抽象,主要包括名称部分、属性部分、操作部分。
2.类图:在UML中,类图用一个矩形框表示,它包含3个区域,最上面是类名,中间是类的属性,最下面是类的方法。
(1)名称:每个类都必须有一个能和其他类进行区分的名称(名称部分不能省略,其他部分可以省略);类的名称是一个字符串,要求是由字符串、数字、下划线组成的唯一字符串。
简单名:一个单独的名称。
全名(路径名):在类名前面加上包的名称
(2)属性:属性描述了类在软件系统中代表事物(即对象)所具备的特性;类可以有任意数目的属性,也可以没有属性,类如果有属性,则每一个属性都必须有一个名字。
UML中类属性的语法:
可见性:共有(Public)类型“+”、私有(Private)“-”、受保护(Protected)“#”;UML的类中不存在默认的可见性,如果没有显示任何一种符号,就表示没有定义该属性的可见性。
属性名:每个属性都必须有一个名字用于区别于类中的其他属性;按照UML的约定,单字属性名称小写,如果属性名包含多个单词,那么这些单词要合并,并且除了第一个单词之外其余单词的首字母要大写;由描述所属类的特性的名词或名词短语组成。
数据类型:说明属性的数据类型。
初始化:为了保护系统的完整性,防止漏掉取值或被非法的值破坏系统的完整性,可以设定属性的初始值。
属性字符串:属性字符串用来指明关于属性的其他信息
(3)操作:操作是对类的对象所能做的事务的一个抽象;一个类可以有任意数量的操作或者根本没有操作,类如果有操作,则每一个操作也都有一个名字。
UML中类操作的语法:
可见性:共有(Public)类型“+”、私有(Private)“-”、受保护(Protected)“#”、包内共有(Package)"~"。
操作名:由描述所属类的行为的动词或动词短语组成。
参数表:一些按顺序排列的属性定义了操作的输入;该选项是可选的,操作不是必须有参数的;参数的定义方式为“名称:类型”;若存在多个参数,则各个参数用逗号隔开,参数可以具有默认值。
返回类型:可选的,操作不是必须有返回类型,绝大多数编程语言只支持一个返回值,void来表示无返回值。
属性字符串:在操作定义中加入一些除了预定义元素之外的信息。
(4)职责:位于操作部分下面的区域,用来说明类要做什么或说明另一个类的信息;类的职责可以是一个短语或一个句子;在UML中,把职责列在类图底部的分隔栏中。
(5)约束:约束指定了该类所要满足的一个或多个规则;在UML中,约束是用{}格式写在类的边上,指定个别属性的取值范围,是一种消除二义性的非形式化方法。
(二)对象图
1.对象
对象指的是一个单独的、可确认的物体单元或实体,它可以是具体的也可以是抽象的,在问题领域中有确切定义的角色。
标识(名字):为了将一个对象和其他对象区分开。
状态(属性):对象的状态包括对象的所有属性和这些属性的当前值。
行为(方法、事件):一个对象根据他的状态改变和消息传送所采取的行动和所作出的响应。
2.对象图
描述的是参与交互的各个对象在交互过程中某个时刻的状态,可以看作类图在某一时刻的实例。
对象名:”对象名:类名“。
属性:属性后面列出其值。
(三)类和对象,类图和对象图的区别
1.类和对象的区别
对象是一个存在于时间和空间的具体实体,类是对对象“本质”的一个抽象;
类共享一个公用结构和一个公共行为对象集合;
类是静态的,对象是动态的;类是一般化的,对象是个性化的;类是定义,对象是实例;类是抽象,对象是具体。
2.类图和对象图的区别
类具有三个分栏:名称、属性和操作,对象只有两个分栏:名称和属性;
在类的名称分栏中只有类名,对象的名称形式为“对象名:类名”,匿名对象的名称形式为“:类名”;
类的属性分栏定义了所有属性的特征,对象只定义了属性的当前值以便于测试用例;
类中列出了操作,对象图中不包括操作,因为对属于同一个类的对象,其操作是相同的;
类使用关联连接·,对象使用链连接。
(四)接口
接口是描述类的部分行为的一组操作,也是一个类提供给另一个类的一组操作;通常接口被描述为抽象操作,也就是只用标识说明他的行为,而真正实现部分放在使用该接口的对象中,即接口只负责定义操作而不负责具体的实现。
(五)抽象类
包含一种或多种抽象方法的类,本身不需要构造实例;定义对象后,其他类可以对它进行扩充,并且通过实现其中的抽象方法,使抽象类具体化。
(六)接口与抽象类的区别
抽象类可以包含某些实现代码,但接口没有任何实现部分;
抽象类可以包含属性,但接口没有;
接口可以被结构继承,但抽象类不行;
抽象类可以有构造函数和析构函数,但是接口没有;
抽象类可以继承其他类和接口,但是接口仅能继承接口;
接口支持多继承,但抽象类仅支持单继承。
二、类之间的关系
(一)依赖关系
1.依赖关系表示两个或多个模型元素之间语义上的关系,一个元素(服务提供者)的某些改变可能会影响或提供消息给其他元素(使用者),即使用者以某种形式依赖于服务提供者。
2.在UML图形中,把依赖画成一条有向的虚线,指向被依赖的事物。
UML定义了4种基本依赖:使用依赖、抽象依赖、授权依赖和绑定依赖:
(1)使用依赖:使用者使用服务提供者所提供的服务实线他的行为;使用依赖共有三个类型,使用依赖、调用依赖、参数依赖、发送依赖、实例化依赖。
(2)抽象依赖:使用者服务提供者之间的关系依赖于在不同抽象层次上的事物;抽象依赖共有三个类型,跟踪依赖、精化依赖、派生依赖。
(3)授权依赖:授权依赖表达了一个事物访问另一个事物的能力,提供者可以规定使用者的权限;授权依赖共有三个类型,访问依赖、导入依赖、友元依赖。
(4)绑定依赖:目标模板使用给定的实际参数进行实例化。
绑定依赖的代码实现:模板类Stack<T>定义栈相关操作,FloatStack将参数T与实际类型float绑定,使得操作都针对float类型的数据。
template<typename T>
class Stack
{
private:
int size;
public:
int Push(T elem);
int Pop();
const T& GetTop();
};
typedef Stack<float> FloatStack;
依赖关系说明表:
(二)泛化关系
1.在类中一般元素被称为父类/超类,而特殊元素则被称为子类。
2.在UML中泛化关系用一条从子类指向父类的带空心三角箭头的实线表示。
(三)关联关系
1.关联关系是一种结构关系,它指明一个事物的对象与另一个事物的对象之间的关系。
2.在UML图形中,关联关系用一条连接两个类的实线表示。
3.关联的基本修饰
(1)关联名:即名称,用来描述关联的性质
通常使用动词或动词短语来命名关联;
它表明源对象正在目标对象上执行的动作;
UML图中为读者提取了一个指引名称方向的三角形,表明名称的方向;
在描述关联关系时,可以分别给关联的两端命名;
如果关联的端点已经明确给出了名称,则不需要给关联关系取名;
如果一个类有多个关联关系,为了进行区分,可以使用关系名或关系端点名;
如果一个关联有多个端点在一个类上,则需要给关联端点命名以便区分。
(2)角色:当一个类处于关联的某一端时,该类就在这个关系中扮演了一个特定的角色
它呈现对另一端的职责,可以显式的命名一个类在关联中承担的角色,关联端点承担的角色称为端点名(或角色名);
端点名称是名词或名词短语。
(3)多重性:在建模时,有时需要说明一个关联实例中有多少相互连接的对象,此时就用得到多重性即多重性是指有多少对象可以参与该关联。
格式:minimum:maximum
一对一、一对多、一对一或多、一对零或一、一对有限间隔、一对一组选择。
UML中使用“*”来表示许多、多个;在一种语义中“..”代表or;在另一种语义中“,”代表or。
5.聚合(特殊的关联关系):一个类描述了一个较大的事物(整体),它由较小的事物(部分)组成,聚合关系正是表示整体和部分关系的关联;UML中聚合关系用带空心菱形的实线来表示,其中头部指向整体。
6.组合关系(强聚合,特殊的聚合关系):在组合中成员对象的生命周期取决于聚合的生命周期,聚合不仅控制着成员对象的行为,而且控制者成员对象的创建和撤销;
在组合式聚合中,一个对象在一个时间段内只能是一个组合的一部分;
整体要对它的各个组成部分进行处置,整体必须管理它的部分的创建和撤销。
在UML中,组合关系用带实心菱形的实线来表示,其中头部指向整体。
7.导航性:关联也有自己的实例,导航性描述的是一个对象通过链(关联的实例)进行导航访问的另一个对象。
导航共分为两类:(1)单向关联(2)双向关联
8.关联类:在两个类之间的关联关系中,关联本身可以具有特性,即关联可以和类一样,也可以有自己的属性和操作,这种情况下,关联实际上被视为一个关联类。
关联类是同时具有类和关系特征的模型元素,一个关联类可以看作一个拥有类特性的关联,也可以看作一个拥有关联特性的类。
关联类的可视化表示方式与一般的类相同,但是要用一条虚线把关联类的对应的关联线连接起来。
关联类也可以与其他类关联。
9.约束
两个类之间的关联可能对应了一个规则,可以通过在关联线附近加注一个约束来说明这个规则。
UML中提供了一个简便、统一和一致的约束,是各个模型元素的一种语义条件或规则,{规则} 。
(四)实现关系
1.实现将一种模型元素与另一种模型元素连接起来
2.实现关系通常在两种情况下被使用:在接口与实现该接口的类之间、在用例与实现该用例的协作之间。
3.在UML中,用一条带有指向接口的空心三角箭头的虚线来表示。
4.实现关系还有一种省略的表示方法,即接口表示为一个小圆圈,并将它和实现接口的类用一段线段连接。