首页 > 其他分享 >UML类图

UML类图

时间:2024-10-24 15:12:49浏览次数:1  
标签:关系 Heart People 类图 关联 Water UML class

UML

单个类图的基本属性

属性的表现形式是[可见性] 属性名:类型 [=默认值]

操作的表现形式是[可见性] 名称(参数列表)[:返回类型]

img

一般类的类名用正常字体粗体表示,如上图;抽象类名用斜体字粗体,如User;接口则需在上方加上<<interface>>

属性和方法都需要标注可见性符号,+代表public#代表protected-代表private

另外,还可以用冒号:表明属性的类型和方法的返回类型,如+$name:string+getName():string。当然,类型说明并非必须。

类之间的关系

继承(泛化)(Generalization):带空心三角箭头的实线来表示,箭头由子类指向父类

实现(Realization):带空心的三角箭头的虚线来表示,箭头从实现类指向接口

关联(Association):分为双向关联和单向关联,其中,双向关联可以用带两个箭头或者没有箭头的实线来表示,单向关联用带一个箭头的实线来表示,箭头从使用类指向被关联的类,还可以再关联线的两端标注角色名,补充说明它们的角色。

聚合(Aggregation),用带空心菱形的实线表示,菱形指向整体

组合(Composition):用带实心菱形的实线来表示,菱形指向整体。

依赖(Dependency):使用带箭头的虚线表示,箭头从使用类指向被依赖的类

img

继承

继承关系也称泛化关系(Generalization),用于描述父类与子类之间的关系。父类又称作基类,子类又称作派生类。

继承关系中,子类继承父类的所有功能,父类所具有的属性、方法,子类应该都有。子类中除了与父类一致的信息以外,还包括额外的信息。

例如:公交车、出租车和小轿车都是汽车,他们都有名称,并且都能在路上行驶。

img

代码实例:

泛化关系: 是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为. 老虎是动物的一种, 即有老虎的特性也有动物的共性。

img

// Animal.h  
class CAnimal  
{  
public:  
    // implement  
    virtual HRESULT EatSomething()  
    {  
        // Do something  
    }  
};  
  
// Tiger.h  
#include "Animal.h"  
class CTiger : public CAnimal  
{  
    // Do something  
};

实现

实现关系(Implementation),主要用来规定接口和实现类的关系

接口(包括抽象类)是方法的集合,在实现关系中,类实现了接口,类中的方法实现了接口声明的所有方法。

例如:汽车和轮船都是交通工具,而交通工具只是一个可移动工具的抽象概念,船和车实现了具体移动的功能。

实现关系

代码实例:

img

// Animal.h  
class CAnimal  
{  
public:  
    // interface  
    virtual HRESULT EatSomething() = 0;  
};  
  
// Tiger.h  
#include "Animal.h"  
class CTiger : public CAnimal  
{  
    // Do something  
};

注: 泛化和实现的区别就在于子类是否继承了父类的实现, 如有继承则关系为泛化, 反之为实现.

组合

组合关系(Composition):整体与部分的关系,但是整体与部分不可以分开

组合关系表示类之间整体与部分的关系,整体和部分有一致的生存期。一旦整体对象不存在,部分对象也将不存在,是同生共死的关系。

例如:人由头部和身体组成,两者不可分割,共同存在。

组合关系

代码实例:

聚合关系: 是整体与部分的关系, 且部分可以离开整体而单独存在. 如车和轮胎是整体和部分的关系, 轮胎离开车仍然可以存在.
组合关系: 是整体与部分的关系, 但部分不能离开整体而单独存在. 如公司和部门是整体和部分的关系, 没有公司就不存在部门.

组合关系: 组合关系代表着整体和部分具有相同的生命周期, 部分不能脱离整体而存在

img

上图表示class People和class Heart为一个组合关系, 可称为Heart组合到People上, 或者People由Heart组合而成.

表示方式1:

People.h

#include "Heart.h"
#include <string>
 
class People {
 public:
  People(std::string name, int count);
  ~People();
 private:
  std::string name;
  Heart heart;
};

People.cpp

#include "People.h"
#include <iostream>
 
using namespace std;
 
People::People(std::string name, int count) : heart(count) {
  this->name = name;
  cout << __FUNCTION__ << endl;
}
 
People::~People() {
  cout << __FUNCTION__ << endl;
}

Heart.h

class Heart {
 public:
  Heart(int count);
  ~Heart();
 private:
  int count;
};

Heart.cpp

#include "Heart.h"
#include <iostream>
 
using namespace std;
 
Heart::Heart(int count) {
  cout << __FUNCTION__ << endl;
  this->count = count;
}
 
Heart::~Heart() {
  cout << __FUNCTION__ << endl;
}

test.cpp

#include "People.h"
#include <unistd.h>
 
int main() {
  {
    People("lh", 70);
  }
  sleep(30);
  return 0;
}

简要的解释一下, 在People类中有两个成员变量, 一个是人的名字name, 另一个是Heart类对象heart. 在Heart类中有一个成员变量, 脉搏次数count. 在People的构造函数中,初始化人的姓名并且初始化Heart类对象heart. 在两个类的构造函数和析构函数中, 通过代码:

cout << __FUNCTION__ << endl;

来输出现在正在执行的函数.

通过测试代码可以得到如下结果:

img

由结果可得: Heart类的构造函数要比People类先执行, 并且在People完成析构之后,Heart也随即析构.满足组合关系, 被组合的对象随着主体的消亡而消亡.

此处插入一个C++中构造函数执行顺序

  1. 静态成员对象的构造函数(如果有的话, 全局仅调用一次构造函数)
  2. 父类构造函数
  3. 成员对象的构造函数(非静态成员)
  4. 自身构造函数

聚合

聚合关系(Aggregation):整体和部分的关系,整体与部分可以分开。

聚合关系也表示类之间整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。

例如:公交车司机和工衣、工帽是整体与部分的关系,但是可以分开,工衣、工帽可以穿在别的司机身上,公交司机也可以穿别的工衣、工帽。

img

代码实例:

聚合和组合的代码示例差不多,但是聚合当整体消亡后,部分可以单独生存,不会一起消亡

关联

关联关系(Association):表示一个类的属性保存了对另一个类的一个实例(或多个实例)的引用

关联关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。组合、聚合也属于关联关系,只是关联关系的类间关系比其他两种要弱。

关联关系有四种:双向关联单向关联自关联多重数关联

例如:汽车和司机,一辆汽车对应特定的司机,一个司机也可以开多辆车。

img

在UML图中,双向的关联可以有两个箭头或者没有箭头,单向的关联或自关联有一个箭头

代码实例:

关联是比依赖更紧密的一种关系,使用实线箭头表示,由源类指向目标类,如:
Water为源类,Climate为目标类

img

C++中的表现形式为,Climate作为Wate类的一个属性,如:

class Climate
{};
 
class Water
{
	Climate m_climate;
};

关联分为单向关联和双向关联,以上的例子为单向关联,双向关联表示双方类都将对方作为属性,如:

class Water;
class Climate
{
	Water* m_water;
};
 
class Water
{
	Climate* m_climate;
};

依赖

依赖关系(Dependence):假设A类的变化引起了B类的变化,则说名B类依赖于A类。

大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数

依赖关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。

例如:汽车依赖汽油,如果没有汽油,汽车将无法行驶。

依赖关系

代码实例:

5种关系中耦合最小的关系,使用虚线箭头表示

img

(1)Water作为全局类,Animal直接调用Water类,如:

class Water
{
};
 
Water *g_water = new Water;
 
class Animal
{
	void Drink()
	{
		g_water;
	}
};

(2)Water作为Animal类某个方法中的局部变量,如:

class Water
{
};
 
class Animal
{
	void Drink()
	{
		//注意:持有Water类的是Drink方法,而不是Animal类。Drink被调用时Water类才被实例化
        Water *water = new Water;
	}
};

(3)Water类作为Animal类某个方法中参数或者返回值,如:

class Animal
{
	void Drink(Water* pWater)
	{
	}
	Water* Drink()
	{
		return new Water();
	}
};

依赖与关联的区别:

从是否是类的属性来看,依赖关系的类并不作为双方的一个属性(即成员),仅作为一个类的某个方法的参数、返回值或变量。而关联关系的类,其中一个类成为另一个类的属性(成员),因此关联关系更紧密。

从生命期来看,依赖关系仅当类的方法被调用时才产生,方法调用结束,依赖关系即结束。而关联关系在类的实例化时即产生,类被销毁后才结束。

总结

这六种类关系中,组合、聚合和关联的代码结构一样,可以从关系的强弱来理解,各类关系从强到弱依次是:继承→实现→组合→聚合→关联→依赖。如下是完整的一张UML关系图。

img

标签:关系,Heart,People,类图,关联,Water,UML,class
From: https://www.cnblogs.com/hnu-hua/p/18499634

相关文章

  • UML与面向对象程序设计原则
    UML与面向对象程序设计原则本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、掌握面向对象程序设计中类与类之间的关系以及对应的UML类图;2、理解面向对象程序设计原则。 [实验任务一]:UML复习阅读教材第一章复习UML,回答下述问题:面向对象程序设计中类与类的关系都......
  • UML之用例图详解
    ~犬......
  • 画图神器之争:PlantUML和Mermaid那个更适合你?
    PlantUML和Mermaid都是流行的工具,用于通过文本描述快速创建图表,特别是UML图。尽管它们的目标相似,但在一些方面存在差异:语法和易用性:PlantUML:使用一种类似于编程语言的语法,对于程序员来说可能更容易上手。它提供了丰富的语法来创建多种类型的UML图。Mermaid:它的语法更加简洁和近......
  • UML 有哪些
       UML(统一建模语言,UnifiedModelingLanguage)是一种标准化的建模语言,用于描述软件系统的结构、行为和交互。它提供了一套图表来帮助开发人员、架构师和业务分析师对系统进行建模。UML图表分为两大类:结构图和行为图。一、UML结构图(StructuralDiagrams)结构图主要......
  • 流程图 泳道图 UML交互图
     程序员这生必须掌握的两种图形  目录背景图解思考流程图基本流程图程序时序图流程图工具结构图层次结构图思维导图结语 背景从客观上来看,程序员经常会碰到这样的情况:很简单的一个需求用文字罗列了很大篇幅,词不达意,讲不到重点,且逻辑混乱。......
  • 小帅和小美有容-UMLChina建模知识竞赛第5赛季第16轮
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。只要最先答对前3题,即可获得本轮优胜。如果有第4题,第4题为附加题,对错不影响优胜者的判定,影响的是......
  • 比CesiumLab还好用的工具:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台
    GIS数据处理工具在现代技术与应用中扮演着至关重要的角色,它们不仅是连接原始地理信息与可分析、可视化数据的桥梁,更是推动地理信息系统(GIS)在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据处理、分析和展示的效率和精度,本文将对比GISBox、Ce......
  • 五款倾斜摄影与三维数据处理工具介绍:GISBox、Cesiumlab、OSGBLab、灵易智模、倾斜伴侣
    随着三维数据处理技术的广泛应用,尤其是在城市规划、地理信息系统(GIS)、工程监测等领域,处理倾斜摄影、三维建模以及大规模数据管理的需求日益增加。以下是五款我精心挑选的倾斜摄影和三维数据处理工具——GISBox、Cesiumlab、OSGBLab、灵易智模和倾斜伴侣,本文将详细介绍它们的功能、......
  • 构造器和UML类图
    1.构造器1.1详解类的成员:构造器构造器的作用初始化对象:构造器用于设置对象的初始值,确保对象在创建时是有效的。提供灵活性:可以重载构造器,以便在创建对象时提供不同数量或类型的参数,从而支持多种初始化方式。限制对象创建:通过构造器,可以控制对象的创建过程,例如通过私有构造......
  • 实验1:UML与面向对象程序设计原则
    [实验任务一]:UML复习阅读教材第一章复习UML,回答下述问题:面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。1、关联关系   2、聚合关系  3、依赖关系  4、组合关系     [实验任务二]:单一职责原则登录模块在实际项目开发中很常见,......