UML类图
简介
类图(Class Diagram)是面向对象系统建模中最常用和最重要的图,用来显示系统中的类,接口以及他们之间的静态结构和关系的一种静态模型。
类的表示
类图有三个基本组件:类名、属性、方法,一个类在类图中用一个有三个区域的矩形表示,其中第一个区域表示类名,第二个区域表示类中包含的属性,第三个区域包括类的方法。当然,第二个区域和第三个区域并不是必须的。
类之间的几种关系
泛化(Generalization)
泛华表示的是is-a的关系;是一种继承关系,表示一般与特殊。在语言中适用继承得以实现。
表示方法:使用带三角箭头表示,从子类指向父类:
比如“猫”是“动物”的一个子类;继承了“动物”的所有属性和动作。他们之间是一种泛化关系。
实现(Realization)
实现是一个类和接口之间的关系:一个类“实现”了一个接口。
表示方法:使用带三角箭头的虚线箭头表示,从类指向接口。比如,“猫”实现一个接口“产仔”。
关联(Association)
关联是一种拥有关系。即可以是双向的关联,也可以是单向的关联。在代码中的体现为成员变量。
表示方法,使用尖的实线箭头表示。指向被关联的类。
比如说猫有一个属性是“窝”,那么“猫”和”窝“就是关联关系;是一个单向的关联。
依赖(Dependency)
依赖是一种使用关系。在代码中体现位类的局部变量、方法的参数等。
表示方法:使用尖的虚线箭头表示。指向被使用的类。
比如说:”猫“洗澡用”水“
聚合(Aggregation)
聚合是关联关系的一种特例,聚合也是一种拥有关系,但是这种拥有关系是可以分离的,他们具有各自的生命周期
代码体现:成员变量
表示方法:带空心菱形的实线,菱形指向整体。
比如:主人拥有猫
组合(Composition)
组合关系也同样是关联关系的一种特例;也称为强聚合。也是整体和部分的关系,但是此时整体和部分是不可以分离的。
代码体现:成员变量
表示方式:带实心菱形箭头的实线,菱形指向整体。
比如:猫拥有心脏。
上问中描述的关系如图所示:
EA
绘制上图使用了软件EA,软件还有通过代码生成UML类图和通过UML类图去生成代码的功能。
下面记录一下怎么使用代码生成UML图:
1. 新建一个工程,选择类图模式。
- 选择导入代码
假设我们有头文件代码如下:
class Animal {
public:
Animal();
~Animal();
private:
void eat();
};
class Cat : public Animal{
public:
Cat();
~Cat();
};
class Human {
public:
Human();
~Human();
Cat cat;
};
生成UML类图如下:
通过UML图生成代码也示在Code Engineering
选项内:
通过上面的图再生成代码如下:
Human.h
///////////////////////////////////////////////////////////
// Human.h
// Implementation of the Class Human
// Created on: 22-7月-2017 10:43:14
// Original author: xxx
///////////////////////////////////////////////////////////
#if !defined(EA_D1057E9F_EC82_4d3b_9885_0441EFB30798__INCLUDED_)
#define EA_D1057E9F_EC82_4d3b_9885_0441EFB30798__INCLUDED_
#include "Cat.h"
class Human
{
public:
Cat cat;
Human();
~Human();
};
#endif // !defined(EA_D1057E9F_EC82_4d3b_9885_0441EFB30798__INCLUDED_)
Cat.h
///////////////////////////////////////////////////////////
// Cat.h
// Implementation of the Class Cat
// Created on: 22-7月-2017 10:43:14
// Original author: xxx
///////////////////////////////////////////////////////////
#if !defined(EA_B6994D59_7541_4bfb_AA0E_C226CB7AEC03__INCLUDED_)
#define EA_B6994D59_7541_4bfb_AA0E_C226CB7AEC03__INCLUDED_
#include "Animal.h"
class Cat : public Animal
{
public:
Cat();
~Cat();
};
#endif // !defined(EA_B6994D59_7541_4bfb_AA0E_C226CB7AEC03__INCLUDED_)
Animal.h
///////////////////////////////////////////////////////////
// Animal.h
// Implementation of the Class Animal
// Created on: 22-7月-2017 10:43:13
// Original author: xxx
///////////////////////////////////////////////////////////
#if !defined(EA_7C06886E_CCC9_46d3_8A5F_542250D47C7C__INCLUDED_)
#define EA_7C06886E_CCC9_46d3_8A5F_542250D47C7C__INCLUDED_
class Animal
{
public:
Animal();
~Animal();
private:
void eat();
};
#endif // !defined(EA_7C06886E_CCC9_46d3_8A5F_542250D47C7C__INCLUDED_)
同时,他也为所有的类函数生成了cpp,这里不贴出来了。