用 C++ 示例解释 UML 类图
如您所知,类图是显示系统中不同类的属性、操作以及不同对象之间关系的图。
即使我已经使用它很长时间了; 每次使用的时候总是很混乱。 这篇文章就是为像我这样的人准备的; 对初学者也有帮助,这里我将用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 类图相关推荐
- 使用实例解释UML类图
使用实例解释UML类图 在我们的平常工作中,完成某个项目或者功能不可能直接打开项目讲解思路,更多的是使用某种图表来表达我们的思想,其中UML类图就是一种非常便利的手段. UML类图基础知识 类 ...
- UML类图实例 (动物)
首先是复习一下UML中九种图的理解:http://xhf123456789plain.blog.163.com/blog/static/172880482201192222144421/ 画用例图:h ...
- 23种设计模式 UML 类图及对应示例代码 (二)
23种设计模式 UML 类图及对应示例代码 (二) 11.DoFactory.GangOfFour.Flyweight.Structural Flyweight:运用共享技术有效的支持大量细粒度的对象 ...
- 23种设计模式【全】 包含:模式定义 使用场景 实现步骤 优缺点 模式区别 UML类图 示例代码 注意项等
23种设计模式(全) ***项目地址***:[GitHub](https://github.com/yjhroot/design-pattern) 声明 模式分类(3大类) 创建型模式(共5种) 结构 ...
- UML类图符号标识符解释
来自:http://liuchuxiong2003.blog.sohu.com/168088327.html 类图Class diagram通过显示出系统的类以及这些类之间的关系来表示系统.类图是静态 ...
- UML类图关系大全 and 报表的基本用法
UML类图关系大全 1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在 GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描 ...
- 看懂UML类图和时序图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
- 设计模式-UML类图
篇文章来总结下UML类图,本来不打算讲UML类图的,因为我在学习设计模式的时候,一遇到有关UML的就会自动忽略,一看感觉就很复杂.但是随着学习的深入,发现不掌握UML类图,对设计模式或者某一个框架没有 ...
- 快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图
快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图 前言 一.UML类图简介 二.类之间的六大关系及UML类图 1.依赖关系及UML类图表示 2.泛化关系及UML类图表示 3.实现关系及UM ...
最新文章
- mysql可视化导入csv文件_我们如何将数据从.CSV文件导入MySQL表?
- 超级Wi-Fi未来潜力不容小觑 有望带动无线地区型网路发展
- form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?
- Apache Flink 在京东的实践与优化
- [转]20款Notepad++插件下载和介绍
- [原创]如何高效的组织我们的测试团队
- 新手程序员必学的代码编程技巧
- 最强PostMan使用教程(1)
- html灯箱效果代码,WordPress纯代码实现图片灯箱lightbox效果
- python爬虫之以腾讯招聘为例,爬取动态页面
- 计算机单招知识点重点,2018年度单招考试《数学》必背知识点(一).doc
- 【整活】修改U盘的图标,让你的U盘与众不同
- 融资规模似雪球越滚越厚,谁能抢占工业互联网的制高点?
- JRs在看啥?- 虎扑社区用户行为分析
- 第十二届业务流程管理大会CBPM宣传
- 基于java web 的企业员工信息管理系统的设计与实现
- 电阻组合c语言程序,【C语言及程序设计】项目1-4-2-2:计算并联电阻
- 2021年中式烹调师(初级)考试题及中式烹调师(初级)试题及解析
- csv文件太大,显示不全,切分成小文件
- win10浏览器闪退_win10系统打开360浏览器就闪退是什么情况?
热门文章
- git 版本回退
- 低成本2.4G SOC(NYA054E)灯控遥控芯片方案-CI2454/CI2451
- 已使用管理员权限运行CMD,仍报错OSError: [WinError 5] 拒绝访问。: ‘E:\\Code\\Python\\Git\\stable-diffusion-webui\\venv\\
- unity 获得所有的tag_CodeGize
- FPGA入门实验-基于状态机实现串口回环收发
- 【机器学习】1-机器学习的分类及重要概念
- LINUX暂停、挂起进程,开启进程
- 神舟k610d i7 d2 黑苹果安装资源 10.15.x
- [小知識] 判斷是否為繁體字(Big5)
- Golang源码探索----GC的实现原理(6)