UML类图关系全面剖析和C++代码表现(转载)
原文:http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx
2006年12月10日
本文随便转载,请保留出处:http://blog.csdn.net/dylgsy/
UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)。而其中关联又分为双向关联、单向关联、自身关联;下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里。
1、关联
双向关联:
C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法。
在 GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的,更适合表达我们所讨论的那种关系。所以这种关系在设计的时候比较少用到,关联一般都是有向的。
使用ROSE 生成的代码是这样的:
class C1
...{
public:
C2* theC2;
};
class C2
...{
public:
C1* theC1;
};
双向关联在代码的表现为双方都拥有对方的一个指针,当然也可以是引用或者是值。
单向关联:
C3->C4:表示相识关系,指C3知道C4,C3可以调用C4的公共属性和方法。没有生命期的依赖。一般是表示为一种引用。
生成代码如下:
class C3
...{
public:
C4* theC4;
};
class C4
...{
};
单向关联的代码就表现为C3有C4的指针,而C4对C3一无所知。
自身关联(反身关联):
自己引用自己,带着一个自己的引用。
代码如下:
class C14
...{
public:
C14* theC14;
};
就是在自己的内部有着一个自身的引用。
2、聚合/组合
当类之间有整体-部分关系的时候,我们就可以使用组合或者聚合。
聚合:表示C9聚合C10,但是C10可以离开C9而独立存在(独立存在的意思是在某个应用的问题域中这个类的存在有意义。这句话怎么解,请看下面组合里的解释)。
代码如下:
class C9
...{
public:
C10 theC10;
};
class C10
...{
};
组合(也有人称为包容):一般是实心菱形加实线箭头表示,如上图所示,表示的是C8被C7包容,而且C8不能离开C7而独立存在。但这是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。在《敏捷开发》中还说到,A组合B,则A需要知道B的生存周期,即可能A负责生成或者释放B,或者A通过某种途径知道B的生成和释放。
他们的代码如下:
class C7
...{
public:
C8 theC8;
};
class C8
...{
};
可以看到,代码和聚合是一样的。具体如何区别,可能就只能用语义来区分了。
3、依赖
依赖:
指C5可能要用到C6的一些方法,也可以这样说,要完成C5里的所有功能,一定要有C6的方法协助才行。C5依赖于C6的定义,一般是在C5类的头文件中包含了C6的头文件。ROSE对依赖关系不产生属性。
注意,要避免双向依赖。一般来说,不应该存在双向依赖。
ROSE生成的代码如下:
// C5.h
#include "C6.h"
class C5
...{
};
// C6.h
#include "C5.h"
class C6
...{
};
虽然ROSE不生成属性,但在形式上一般是A中的某个方法把B的对象作为参数使用(假设A依赖于B)。如下:
#include "B.h"
class A
...{
void Func(B &b);
}
那依赖和聚合\组合、关联等有什么不同呢?
关联是类之间的一种关系,例如老师教学生,老公和老婆,水壶装水等就是一种关系。这种关系是非常明显的,在问题领域中通过分析直接就能得出。
依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖,依赖也可说是一种偶然的关系,而不是必然的关系,就是“我在某个方法中偶然用到了它,但在现实中我和它并没多大关系”。例如我和锤子,我和锤子本来是没关系的,但在有一次要钉钉子的时候,我用到了它,这就是一种依赖,依赖锤子完成钉钉子这件事情。
组合是一种整体-部分的关系,在问题域中这种关系很明显,直接分析就可以得出的。例如轮胎是车的一部分,树叶是树的一部分,手脚是身体的一部分这种的关系,非常明显的整体-部分关系。
上述的几种关系(关联、聚合/组合、依赖)在代码中可能以指针、引用、值等的方式在另一个类中出现,不拘于形式,但在逻辑上他们就有以上的区别。
这里还要说明一下,所谓的这些关系只是在某个问题域才有效,离开了这个问题域,可能这些关系就不成立了,例如可能在某个问题域中,我是一个木匠,需要拿着锤子去干活,可能整个问题的描述就是我拿着锤子怎么钉桌子,钉椅子,钉柜子;既然整个问题就是描述这个,我和锤子就不仅是偶然的依赖关系了,我和锤子的关系变得非常的紧密,可能就上升为组合关系(让我突然想起武侠小说的剑不离身,剑亡人亡...)。这个例子可能有点荒谬,但也是为了说明一个道理,就是关系和类一样,它们都是在一个问题领域中才成立的,离开了这个问题域,他们可能就不复存在了。
4、泛化(继承)
泛化关系:如果两个类存在泛化的关系时就使用,例如父和子,动物和老虎,植物和花等。
ROSE生成的代码很简单,如下:
#include "C11.h"
class C12 : public C11
...{
};
5、这里顺便提一下模板
上面的图对应的代码如下:
template<int>
class C13
...{
};
这里再说一下重复度,其实看完了上面的描述之后,我们应该清楚了各个关系间的关系以及具体对应到代码是怎么样的,所谓的重复度,也只不过是上面的扩展,例如A和B有着“1对多”的重复度,那在A中就有一个列表,保存着B对象的N个引用,就是这样而已。
好了,到这里,已经把上面的类图关系说完了,希望你能有所收获了,我也费了不少工夫啊(画图、生成代码、截图、写到BLOG上,唉,一头大汗)。不过如果能让你彻底理解UML类图的这些关系,也值得了。:)
分享到:
相关推荐
本主题将围绕“cpp-C源代码自动分析工具得到UML类图和函数间调用关系网图”这一主题进行展开,介绍如何利用工具来可视化和理解C++代码的结构。 UML(统一建模语言)是一种标准化的建模语言,用于软件工程中的系统...
本主题主要探讨的是一个C++实现的消息队列处理机制,包括消息注册模型,并提供了可编译的源码以及UML类图模型,帮助开发者理解其内部结构和交互。 首先,让我们深入理解消息队列的工作原理。消息队列是一种先进先出...
UML类图则帮助理解各个类之间的关系和职责分配,它是理解设计模式的重要工具,能够直观地展示类与类之间的继承、关联、聚合和组合等关系。 实验报告则详细阐述了每个模式的意图、结构、参与者以及协作方式,同时也...
C ++源代码自动分析工具,得到UML类图,函数间调用关系网图及相关文档 配置:--java 自行配置JDK --graphviz sudo apt install graphviz --libclang sudo apt-get install libclang-dev sudo ln -s /usr/lib/llvm...
类图编辑器是一种图形用户界面工具,用于设计和可视化面向对象程序中的类结构。这个特定的类图编辑器是基于...通过分析和使用这个工具,开发者不仅可以提升C++和MFC的技能,还可以深入了解UML类图的创建和应用。
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何...收取的费用仅用于收集和整理资料耗费时间的酬劳
通过逆向工程,Rational Rose可以将C++代码的类结构和数据库的Schema映射为UML类图和数据模型图。这使得开发团队能更清晰地了解系统的组织和交互,有助于进行系统升级、分析和维护工作,提高工作效率。 值得注意的...
书中会详细解释如何使用UML类图来设计C++类,包括类的属性、操作、继承、关联、聚合和组合等关系。对象图则用于展示类实例之间的关系。 4. **动态行为建模**:序列图和协作图用于描述对象间的交互顺序,状态图和...
书中还会深入讲解如何将UML应用于C++程序设计,包括如何从UML模型生成C++代码,以及如何反向工程,即从已有的C++代码中提取UML模型。这种双向工程能力使得开发者可以在设计阶段就预览代码结构,同时也能通过模型来...
【UML与Rational Rose/C++ Ver 4.x】是面向对象软件开发中重要的...通过本教材的学习,学员将能够掌握UML的基本语言,熟练运用Rational Rose进行可视化建模,并能将模型转换为C++代码,从而提升软件开发的质量和效率。
在Java和C++中,类图可以直接映射到代码结构,有助于设计和理解软件的架构。 3. **序列图**:序列图描述了对象之间动态交互的过程,特别是在时间序列上的消息传递。这种图对于理解系统中的多对象协同工作过程非常有...
本文将深入探讨UML类图中的类间关系,特别关注纵向关系——继承。 继承是面向对象编程(OOP)的核心概念之一,它在UML类图中通过一个箭头表示,箭头从子类指向父类。这种关系允许子类(也称为派生类或子类型)继承...
- **关系**:用例之间可以定义关系,包括泛化关系、包含关系和扩展关系。 ##### 3.2 用例间关系 - **泛化关系**:子用例继承父用例,表示不同技术实现的同一业务目的。 - **包含关系**:一个用例包含另一个用例的...
掌握UML类图的绘制和理解,不仅可以提升设计质量,还能提高团队间的沟通效率,因为类图提供了一种直观的共享系统设计的手段。在实际开发过程中,结合C++的编程实践,类图能够帮助开发者更好地组织代码,避免不必要的...
2. **C++建模**:C++作为一门强大的面向对象编程语言,其建模通常涉及类和对象的关系、继承、多态等概念,UML工具可以帮助开发者清晰地表示这些概念。 3. **与Java建模工具的对比**:Java和C++都是常用的面向对象...
协作图则更注重对象间的交互关系和结构,强调谁与谁合作。这些图可以与C++的虚函数、回调函数等机制相结合,帮助设计出灵活、可扩展的系统。 压缩包内的文件名为jpg格式,可能是书中关键页面的扫描图像,包括page-...
类图是统一建模语言(UML)中的一个重要概念,它是面向对象设计的核心部分,用于表示系统中的类、接口、协作以及它们之间的关系。在实验2中,我们将深入理解和掌握类图的建模过程,包括如何使用建模工具进行绘制,并...
在类图中,类与类之间的关系是核心内容之一,常见的关系包括依赖关系、泛化关系、关联关系、聚合关系、组合关系和实现关系。 依赖关系(Dependence)是指一个类使用或依赖另一个类的方法或属性,如果发生变化,可能...
综上所述,本文档通过具体的例子展示了如何将UML图转换为C++代码,涉及到了包的实现、类的定义与实现、关联关系及聚合关系等关键概念。这些原则不仅适用于C++,也广泛应用于其他面向对象的语言中。