目录
继承
继承也叫作泛化关系,用于描述父子之间的关系,父类又称为基类或者超类,子类又称作派生类,在uml中,泛化关系用空心三角形的实线来表示
(1)普通继承关系
假如定义了一个person,student 以及teacher类
class Persion
{
public:
string getName()
{
return name;
}
void setName(string name)
{
this->name = name;
}
protected:
void playBasketball()
{
pass();
}
private:
void pass()
{
}
private:
string name = "Jack";
};
此类对应的uml为
class Student : public Persion
{
public:
void study()
{
}
private:
string studentNo;
};
class Teacher : public Persion
{
public:
void teach()
{
}
private:
string teacherNo;
};
那么,用uml表示这种关系应当为
(2)抽象继承关系
比如想实现一个链表(Link),插入(insert)与删除(remove)动作让子类去实现,链表本身只实现统计链表中元素个数的动作(count),然后有一个子类单向链表(OneWayLink)去实现父类没有实现的动作,c++代码为:
// 抽象类(含有纯虚函数的类)
class Link
{
public:
virtual void insert() = 0;
virtual void remove() = 0;
int count()
{
return 0;
}
};
// 子类
class OneWayLink : public Link
{
public:
void insert()
{
}
void remove()
{
}
};
其uml的画法为
关联
关联关系事类与类之间之间最常见的一种关系,它是一种结构化的关系,表示一类对象与另一类对象之间有联系,如汽车和轮胎,师傅和徒弟,班级和学生等。在uml类图中,用实线连接有关联关系的对象所对应的类,在c++中通常将一个类的对象作为另一个类的成员变量。关联关系分为单向关联,双向关联,自关联。
(1)单向关联关系
单向关联指的是关联只有一个方向,比如顾客(customer)拥有地址(address),代码实现为:
// 地址类
class Address
{
};
// 顾客类
class Customer
{
private:
Address address; // 作为成员变量
};
UML画法为:
(2)双向关联关系
默认情况下的关联关系都是双向的,比如顾客(customer)购买商品(product),反之,卖出去的商品总是与某个顾客与之相关联,c++的写法为:
// 商品类
class Product
{
private:
Customer customer; // 该商品属于哪一位顾客, 作为成员变量
};
// 顾客类
class Customer
{
private:
Product product[64]; // 给顾客购买了哪些商品, 作为成员变量
};
对应的uml类图为
(3)自关联关系
自关联,指的是对象中的属性为对象本身,这在链表中比较常见,单向链表Node会维护一个他的前驱Node,双向链表Node中会维护一个前驱Node和他的一个后继Node。以单向链表为例,c++写法为:
// 链表节点
class Node
{
private:
Node* nextNode; // 指向后继节点的指针, 作为成员变量
};
对应的uml类图为
聚合
聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。在uml中,聚合关系用空心菱形的直线表示,如汽车(Car)与引擎(Engine),轮胎(Wheel),车灯(Light),c++表示为
class Engine
{
};
class Wheel
{
};
class Light
{
};
class Car
{
public:
Car(Engine engine, Light light, Wheel wheel)
{
this->engine = engine;
this->light = light;
this->wheel = wheel;
}
void drive()
{
}
private:
Engine engine;
Light light;
Wheel wheel;
};
对应的uml类图为
代码实现聚合关系,成员对象通常以构造方法、Setter方法的方式注入到整体对象之中。谁中有别人的对象在谁那里画菱形。
组合
组合(composition)关系也表示的是一种整体与部分的关系,但是在组合关系中整体对可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系。在uml中组合关系用带实心菱形的直线表示。
比如人的头(Head)和嘴巴(Mouth),鼻子(Nose),嘴巴和鼻子是头的组成部分之一,一旦头没了,嘴巴也没了,因此头和嘴巴,鼻子是组合关系,c++表示为
class Mouth
{
};
class Nose
{
};
class Head
{
public:
Head()
{
mouth = new Mouth();
nose = new Nose();
}
void shake()
{
}
private:
Mouth *mouth;
Nose *nose;
};
uml表示为
代码实现组合关系,通常在整体类的构造方法中直接实例化成员类,因为组合关系的整体和部分是共生关系,如果通过外部注入,那么即使整体不存在,那么部分还是存在的,就相当于一种聚合关系。
依赖
依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
比如,驾驶员(Driver)开车,Driver类的drive()方法将车(Car)的对象作为一个参数传递,以便在drive()方法中能够调用car的move()方法,且驾驶员的drive()方法依赖车的move()方法,因此也可以说Driver依赖Car,C++代码为:
class Car
{
public:
void move();
};
class Driver
{
public:
void drive(Car car)
{
car.move();
}
};
其uml表示为
依赖关系通常通过三种方式来实现:
(1)将一个类的对象作为另一个类中方法的参数
(2)在一个类的方法中将另一个类的对象作为其对象的局部变量
(3)在一个类的方法中调用另一个类的静态方法