首页 > 分享 > UML类图

UML类图

从油管里看到了个视频,虽然是个广告但感觉讲UML非常清晰,推荐下:UML Class Diagram Tutorial。能翻墙的场景不是很多,自己整理下方便日后直接看笔记,顺便写点自己的理解。

UML类图 基本特征类的关系继承关联聚合组合多重性

假设我们要建立一个动物园系统,根据这个动物园系统来详细讲述UML相关知识

基本特征

  动物园中有很多动物,为了描述这些动物,我们可以建一个动物类Animal,该类的实例将是某个特定的动物。
  我们可以通过属性(attributes)来确定Animal的每个实例。属性是一条重要数据,其中包含描述该类的每个实例的值。例如我们建立name、ID、age等属性,这样就可以确定一个具体的实例了。例如name小明、编号100、年龄10岁。这些属性都需要进行格式化。属性字段前面放可见性符号,属性名后面放数据类型,属性放在类图的中间。
  在类图的最下方我们放置方法或者函数。方法允许我们指定类的行为特征。方法也需要格式化,在方法前面放上可见性,后面加上括号表示这是函数,也可以添加变量和数据类型。
  上面提到的可见性,表示它的可访问性。-表示private,+表示public,#表示protected,~表示package或者default。
在这里插入图片描述

类的关系

继承

在这里插入图片描述
  继承就是子类和父类的关系。例如我们建立三个具体的动物类Dog、Cat、Snake继承Animal,那么这三个类就同时继承了name、id和age这三个属性。我们也可以单独给子类添加新属性,如Cat添加whiskerLength表示胡子长度。继承的优势在于我们想要为所有动物添加一个属性的时候,直接在Animal里增加即可,不至于去每个子类里添加,这就是抽象的优势。具体我们不会去实例一个Anilma类,而是实例化一个子类。

  继承使用的是空心箭头
在这里插入图片描述

关联

  关联是一种很弱的关系,用直线或者直线+箭头表示。例如我们建立一个mouse老鼠类。在Mouse和cat之间建立联系。我们说猫吃老鼠,但是不能说他俩之间有依赖关系。关联的对象之间没有任何强制约束,只要二者同意可以随时建立或者接触关联。
在这里插入图片描述

class CMouse { public:int32_t rp; public:CMouse(){rp = rand() % 10;} }; class CCat { private:CMouse* m_pMouse; public:CCat(){m_pMouse = nullptr;}void FindFood(CMouse* pMouse){if (pMouse->rp >= 5){m_pMouse = pMouse;}}void eatFood(){if (m_pMouse == nullptr){cout << "真不走运,没吃的" << endl;}else{cout << "真好吃啊" << endl;}} }; int main() {srand((uint32_t)time(0));CCat cat;CMouse mouse;cat.FindFood(&mouse);cat.eatFood();return 0; }

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

聚合

  聚合是一种强版本的关联类型,用来说明整体和部分的关系,被聚合的对象还可以被别的对象关联。举例如下。动物园建立了一个爬行动物馆,我们的Snake的一个实例就在爬行动物管里。但是Snake和爬行动物管并没用强依赖的关系,如果有一天爬行动物管不存在了,我们的Snake仍然存在(如果它没死的话2333).。这种一部分可以存在于整体之外的关系就是聚合,用空心菱形标记。
  聚合关系方便对象的管理,只需要操作大类即可。
在这里插入图片描述

class CSnake { }; class Reptilian { private:CSnake* arr[10]; public:Reptilian(){for (int i = 0; i < 10; i++){arr[i] = 0;}}~Reptilian(){for (int i = 0; i < 10; i++){delete arr[i];}}void PushSnake(CSnake* pSnake){for (int i = 0; i < 10; i++){if (arr[i] == 0){arr[i] = pSnake;return;}}} }; int main() {CSnake* p1 = new CSnake;CSnake* p2 = new CSnake;CSnake* p3 = new CSnake;//蛇和爬行类聚合在一起,可以用一个爬行类来管理这里面所有的蛇Reptilian rp;rp.PushSnake(p1);rp.PushSnake(p2);rp.PushSnake(p3);return 0; }

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

组合

  组合和聚合很容易分不清。组合关系也是表示整体和部分的关系,但是它要求部分不能脱离整体之外。组合关系用实心菱形表示。
  我们可以举例表达组合和聚合的关系。例如动物园里的访客中心、访客中心里的厕所、访客中心里的雇员。如果有一天访客中心要拆掉了,雇员并不会因为访客中心不存在了而消失,还依然存在,可以去其他部门或其他地方任职(聚合关系),但是访客中心里的厕所却要和访客中心大楼同归于尽了(组合关系)。

  具体到代码里,组合关系,实例的生命周期都是相同的。举一个最极端的例子,组合就是人和人的脑袋的关系。

class CHead { public:void say(){cout<<"我是个脑袋"<<endl;} }; class CPerson { private:CHead m_cHead; public:void Say(){cout << "说句话" << endl;m_cHead.say();} }; int main() {CPerson ps;ps.Say();return 0; }

1234567891011121314151617181920212223242526

在这里插入图片描述

多重性

  在讨论关系的时候,另一个重要概念是多重性,我们可以在关系里设置数字约束。n表示有n个,n…*表示至少有n个,m…n表示实例数量在m到n之间

在这里插入图片描述

相关知识

UML类图实例 (动物)
宠物店管理系统uml图
uml状态图实验6
UML建模——行为图(状态图、活动图)
软件工程课程设计【宠物医院】UML
宠物医院管理系统UML建模与设计
系统建模uml语言(用例图、实现类图、状态图、顺序图、活动图、组件图、部署图、详细类图、uml文档设计)
软件工程第六小组【萌友宠物圈】UML图设计
宠物APP用户旅程图
第10组 团队项目

网址: UML类图 https://m.mcbbbk.com/newsview633003.html

所属分类:萌宠日常
上一篇: 咸水泥彩龟的饲养全攻略(从宠物到
下一篇: 5.1.5 两栖动物和爬行动物