如您所知,类图是显示系统中不同类的属性、操作以及不同对象之间关系的图。

即使我已经使用它很长时间了; 每次使用的时候总是很混乱。 这篇文章就是为像我这样的人准备的; 对初学者也有帮助,这里我将用C++类示例解释类图。

类表示

class Circle
{
private:double radius;Point center;
public:setRadius(double radius);setCenter(Point center);double getArea();double getCircumfrence();
};

上述类的类图如下所示。

类的不同可见性可以表示为

“+” Public
“-” Private
“#” Protected

不同的参数方向

“in”参数是一个输入参数。
“Inout” 该参数既可以输入也可以输出。
“Out” 该参数是一个输出参数。

类中不同类型的成员

1) 静态成员用下划线表示。
2) 纯虚函数用斜体表示。

类关系

在一个系统中,一个类可能与不同的类相关,以下是不同的关系。

  • 关联(Association)(知道一个)
  • 依赖(Dependency)(使用一个)
  • 聚合(Aggregation)(有一个)
  • 组合(Composition )(有一个)
  • 继承(Inheritance)(是一个)
  • 类模板(Class template)

关系中的不同多重性

“0..1” 没有实例,或一个实例(可选)
“1” 正好一个实例
“0..* or *” 零个或多个实例
“1..*” 一个或多个实例(至少一个)

关联(Association)

一个类知道另一个类; 一个类包含指向另一个类对象的指针或引用。

关联可以分为单向关联、双向关联、自身关联。

1)单向关联

单向关联X->Y:表示X“知道”Y,X可以调用Y的公共属性和方法。没有生命周期的依赖。

表示

C++ 示例

class X
{
public:Y *pY;
};class Y
{
};

这里“X”类中的“Y *pY”没有任何生命周期依赖(组合),也没有暗示任何包含(聚合); 所以它是一个关联。

2)双向关联

双向关联X-Y:双方都“知道”对方,都可以调用对方的公共属性和方法。

表示

C++ 示例

class X
{
public:Y* pY;
};class Y
{
public:X* pX;
};

3)自身关联

自身关联:自己引用自己,这个在链表中非常常见。

可以看到,下面的Object类,就是一个自身关联的应用,它有一个自己指向自己的指针,用来实现链表。

表示

C++ 示例

class Object
{
public:int data;Object *next;
};class ObjectList
{
public:Object *first;ObjectList();void insert(Object* obj);void print() const;
};

依赖(Dependency)

依赖用来表述一个类X“use”了另一个类Y。X可以是通过任何方式“use”类Y,如:

1)X的成员函数的返回值为Y;

2)X的成员函数使用Y作为函数参数;

3)X的成员函数的内部实现使用了Y;

表示

依赖关系通常使用虚线箭头“---->”表示,箭头指向被“use”的类。

C++示例

class X
{...Y    f0()     {…;  return y;      }void f1(Y y)  {…;  y.Foo();       }void f2(Y *y) {…;  y->Foo();      }void f3(Y &y) {…;  y.Foo();       }void f4()     {   Y y; y.Foo();  …}void f5()     {…; Y::StaticFoo(); }...
};

聚合(Aggregation)

当一个类是其他类的集合或容器,但容器中包含的类对容器没有很强的生命周期依赖时,就会发生聚合——本质上,如果容器被销毁,它的内容不会被销毁。 您可能会混淆聚合和关联。关联与聚合的不同之处仅在于关联不表示任何包含关系。

表示

Window类包含其Shape的列表,Shape也可能被其他类共享;Shape的生命周期不取决于Window类。

C++示例

class Window
{
public://...
private:vector<Shape> itsShapes;
};

组合(Composition )

组合是更强的聚合形式。 当一个类是其他类的集合或容器,但容器中包含的类对容器具有很强的生命周期依赖性时,可能会发生组合——本质上,如果容器被销毁,其内容也会被销毁。

表示

C++ 示例

class Point
{
};class Circle
{
private:...Point center;
....
};
class X {
...
Y a; // 1; Composition
Y b[10]; // 0..10; Composition
};class X {
X() { a = new Y[10]; }
~X(){ delete [] a; }
...
Y *a; // 0..10; Composition
};class X {
...
vector<Y> a;    // if X contains vector, it is a composition;
};class X {
...
vector<Y*> a;    // if X contains vector, and construction and destruction of Y* happen // inside X (in constructor/destructor) it is composition; otherwise // aggregation.
};

继承(Inheritance )/泛化(Generalization)

在继承关系中,一个类是从另一个类派生的。 这是两个类之间的“是一个”关系。

表示

这里Shape是一个抽象类,这就是它以斜体显示的原因。 Shape类的Draw()和Erase()方法是纯虚函数,所以也用斜体表示。

C++示例

class Shape
{
public:virtual void Draw() = 0;virtual void Erase() = 0;
};class Circle : public Shape
{
};class Ellipse : public Shape
{
};

类模板

模板类是泛型类。C++、java、C#等语言都支持泛型编程。

表示

C++ 表示

template
class X {
...
...
...
};
X Y
...
X a;
...

template <typename Key, typename T>
calss MyMap
{
public:MyMap(){}virtual ~MyMap(){}
};typedef MyMap<int, Person*> PersonMap;

参考链接:EA画UML图中如何创建类模板

// 简单的一个C++代码,实现数组的建立,以及给数组第一个元素赋初值和得到数组第一个元素的值
#include <iostream>using namespace std;template <typename T, int size>
class Array
{
private:T elements[size];public:void addElement(T e){elements[0] = e;}T getElement(int i){return elements[i];}
};using IntArray = Array<int, 20>;
using FloatArray = Array<float, 10>;
using CharArray = Array<char, 30>;int main()
{IntArray array_int;array_int.addElement(3);cout << array_int.getElement(0) << endl;FloatArray array_float;array_float.addElement(3.5);cout << array_float.getElement(0) << endl;CharArray array_char;array_char.addElement('4');cout << array_char.getElement(0) << endl;return 0;
}

运行结果:

扩展阅读:UML—模板类实现

UML之类图

翻译原文:UML Class Diagram Explained With C++ samples

参考文章:C++ UML小结

UML学习:统一建模语言(UML)学习指南

visio绘制UML:

Visio画UML类图

visio中创建自定义的数据类型

用Visio做类图时,如何表示虚函数?内详

UML软件:免费在线流程图思维导图

用 C++ 示例解释 UML 类图相关推荐

  1. 使用实例解释UML类图

    使用实例解释UML类图   在我们的平常工作中,完成某个项目或者功能不可能直接打开项目讲解思路,更多的是使用某种图表来表达我们的思想,其中UML类图就是一种非常便利的手段. UML类图基础知识   类 ...

  2. UML类图实例 (动物)

    首先是复习一下UML中九种图的理解:http://xhf123456789plain.blog.163.com/blog/static/172880482201192222144421/ 画用例图:h ...

  3. 23种设计模式 UML 类图及对应示例代码 (二)

    23种设计模式 UML 类图及对应示例代码 (二) 11.DoFactory.GangOfFour.Flyweight.Structural Flyweight:运用共享技术有效的支持大量细粒度的对象 ...

  4. 23种设计模式【全】 包含:模式定义 使用场景 实现步骤 优缺点 模式区别 UML类图 示例代码 注意项等

    23种设计模式(全) ***项目地址***:[GitHub](https://github.com/yjhroot/design-pattern) 声明 模式分类(3大类) 创建型模式(共5种) 结构 ...

  5. UML类图符号标识符解释

    来自:http://liuchuxiong2003.blog.sohu.com/168088327.html 类图Class diagram通过显示出系统的类以及这些类之间的关系来表示系统.类图是静态 ...

  6. UML类图关系大全 and 报表的基本用法

    UML类图关系大全 1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在 GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描 ...

  7. 看懂UML类图和时序图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...

  8. 设计模式-UML类图

    篇文章来总结下UML类图,本来不打算讲UML类图的,因为我在学习设计模式的时候,一遇到有关UML的就会自动忽略,一看感觉就很复杂.但是随着学习的深入,发现不掌握UML类图,对设计模式或者某一个框架没有 ...

  9. 快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图

    快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图 前言 一.UML类图简介 二.类之间的六大关系及UML类图 1.依赖关系及UML类图表示 2.泛化关系及UML类图表示 3.实现关系及UM ...

最新文章

  1. mysql可视化导入csv文件_我们如何将数据从.CSV文件导入MySQL表?
  2. 超级Wi-Fi未来潜力不容小觑 有望带动无线地区型网路发展
  3. form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?
  4. Apache Flink 在京东的实践与优化
  5. [转]20款Notepad++插件下载和介绍
  6. [原创]如何高效的组织我们的测试团队
  7. 新手程序员必学的代码编程技巧
  8. 最强PostMan使用教程(1)
  9. html灯箱效果代码,WordPress纯代码实现图片灯箱lightbox效果
  10. python爬虫之以腾讯招聘为例,爬取动态页面
  11. 计算机单招知识点重点,2018年度单招考试《数学》必背知识点(一).doc
  12. 【整活】修改U盘的图标,让你的U盘与众不同
  13. 融资规模似雪球越滚越厚,谁能抢占工业互联网的制高点?
  14. JRs在看啥?- 虎扑社区用户行为分析
  15. 第十二届业务流程管理大会CBPM宣传
  16. 基于java web 的企业员工信息管理系统的设计与实现
  17. 电阻组合c语言程序,【C语言及程序设计】项目1-4-2-2:计算并联电阻
  18. 2021年中式烹调师(初级)考试题及中式烹调师(初级)试题及解析
  19. csv文件太大,显示不全,切分成小文件
  20. win10浏览器闪退_win10系统打开360浏览器就闪退是什么情况?

热门文章

  1. git 版本回退
  2. 低成本2.4G SOC(NYA054E)灯控遥控芯片方案-CI2454/CI2451
  3. 已使用管理员权限运行CMD,仍报错OSError: [WinError 5] 拒绝访问。: ‘E:\\Code\\Python\\Git\\stable-diffusion-webui\\venv\\
  4. unity 获得所有的tag_CodeGize
  5. FPGA入门实验-基于状态机实现串口回环收发
  6. 【机器学习】1-机器学习的分类及重要概念
  7. LINUX暂停、挂起进程,开启进程
  8. 神舟k610d i7 d2 黑苹果安装资源 10.15.x
  9. [小知識] 判斷是否為繁體字(Big5)
  10. Golang源码探索----GC的实现原理(6)