注:本文第一章所使用的UML工具是umbrello。
目录
1 依赖(Dependency)
1.1 定义
元素A的变化会影响元素B,但反之不成立,那么B和A的关系就是依赖,B依赖于A。依赖总是单向的(要避免双向依赖,一般不应该存在双向依赖)。
1.2 功能概述
依赖总是单向的(要避免双向依赖,一般不应该存在双向依赖)。在C++中体现为局部变量、方法的参数、对静态方法的调用。如在软件开发过程汇总,往往会设计一些公用类供其他类使用,如果这些公用类出了问题,那调用这些类的类也会因此出现问题。
1.3 表示方法
依赖(Dependency)关系用虚线来表示,箭头指向被依赖元素。
代码分析:
#include <iostream>
#include <string>
using namespace std;
class Dell
{
public:
Dell(){m_computer_mode = "Dell"}
string getComputerMode(){
return m_computer_mode;
}
private:
string m_computer_mode;
};
class Computer
{
public:
Computer(){}
void setMode(Dell dell){
m_computer_mode = dell.getComputerMode()
}
private:
string m_computer_mode;
};
其中Dell类是被依赖项,Computer类调用Dell类的实例,Computer类依赖于Dell类,用UML图表示为:
Dell 类变动会影响Computer类,但Computer类的变动不会影响Dell类。
2 关联(Association)
2.1 定义
元素间的结构化关系,一种弱关系, 被管理的元素通常可以被独立的考虑。相比于聚合,不是包含关系,如汽车和人没有必要的包含关系。
2.2 功能概述
在C++ 中体现为成员变量(属性),但是没有包含关系。关联可以是单向,也可以是双向,也可以自身关联。
2.3 表示方法
关联(Association)关系用实线箭头来表示。单向关联用一个箭头,双向关联没有箭头或者两个箭头。
参考代码:
#include <iostream>
#include <string>
using namespace std;
//
class Car
{
public:
Car(){}
private:
};
class Person
{
public:
Person(){}
private:
std::list<Car> m_car_list;
};
Thinkpad 类的实例作为Computer的属性变量,用UML表示:
3 聚合(Aggregation)
3.1 定义
聚合关系是关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。如部门由员工组成。聚合的个体可能是被多个整体共享,不一定会随某个整体的破坏而破坏。
3.2 功能概述
聚合关系在C++代码中体现为成员变量(属性), 但区别于关联,关联是两个类处于同一层次上,但聚合中两个类处于不同的层次上,一个代表整体,一个代表部分。
3.3 表示方法
聚合关系用空心菱形箭头表示,菱形头指向整体。
代码实例:
#include <iostream>
#include <string>
using namespace std;
//轮胎
class Tire
{
public:
Tire(){}
};
class Car
{
public:
Car(){};
private:
std::list<Tire> m_tire_list;
};
uml 表示:
4 组合(Composition)
4.1 定义
组合(Composition)是聚合关系的变种,表示元素间更强的组合关系。组合关系中,整体被破坏,个体也一定会被破坏。
4.2 功能概述
组合关系(Compositon)要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期(一荣俱荣,一损俱损)。
C++中,Composition以属性身份存在。
4.3 表示方法
Composition 用实心菱形箭头来表示,箭头指向整体。
代码示例:
#include <iostream>
#include <string>
using namespace std;
//
class Heart
{
public:
Heart(){}
};
class Person
{
public:
Person(){};
private:
Heart m_heart;
};
uml 图表示:
5 实现(Realization)
5.1 定义
元素A定义一个约定,元素B实现这个约定,则B和A的关系就是Realize, B Realize A。通常用于接口(interface)定义。
5.2 功能概述
C++ 中的实现,一般用于类实现接口,含有抽象基类的继承方式。
5.3 表示方式
Realization用空心箭头和虚线表示,箭头指向接口。
6 泛化(Generalization)
6.1 定义
通常所说的继承,不多说。
6.2 功能概述
一般用于类的继承
6.3 表示方式
Generalization用带空心箭头的实线表示。箭头指向父类(被继承类)
uml表示:
总结:泛化与实现用于类的继承,依赖用于临时变量,静态函数等,组合、聚合、关联用于属性变量。