UML类图关系全面剖析

来源:互联网 发布:平板电脑安全软件 编辑:程序博客网 时间:2024/05/18 03:53
转  
http://blog.csdn.net/dylgsy/

UML类图关系分 关联、聚合/合、依、泛化(承)。而其中关联又分双向关联关联、自身关联;下面就一起来看看系究竟是什,以及它的区在哪里。
1
关联

双向关联
C1-C2
:指双方都知道方的存在,都可以方的公共属性和方法。
GOF设计模式上是这样描述的:然在分析这种关系是适用的,但我们觉得它于描述设计模式内的类关系来说显得太抽象了,因设计阶关联关系必被映射为对象引用或指象引用本身就是有向的,更适合表达我讨论的那种关系。所以这种关系在设计候比少用到,关联一般都是有向的。
使用ROSE 生成的代这样的:

class C1 
...{
public:
    C2* theC2;

};

class C2 
...{
public:
    C1* theC1;

};

双向关联在代的表现为双方都方的一个指,当然也可以是引用或者是

关联:
C3->C4
:表示相识关系,指C3知道C4C3可以C4的公共属性和方法。没有生命期的依。一般是表示引用。

生成代如下:

class C3 
...{
public:
    C4* theC4;

};

class C4 
...{

};

关联的代就表现为C3C4的指,而C4C3一无所知。


自身关联(反身关联):
自己引用自己,着一个自己的引用。
如下:

class C14 
...{
public:
    C14* theC14;

};

就是在自己的内部有着一个自身的引用。
2
、聚合/
有整体-部分系的候,我就可以使用合或者聚合。

聚合:表示C9聚合C10,但是C10可以离C9而独立存在(独立存在的意思是在某个用的问题域中的存在有意解,看下面合里的解)。

如下:

class C9 
...{
public:
    C10 theC10;

};

class C10 
...{

};



合(也有人称包容):一般是心菱形加实线表示,如上所示,表示的是C8C7包容,而且C8不能离C7而独立存在。但视问题域而定的,例如在心汽域里,胎是一定要合在汽车类中的,因它离了汽就没有意了。但是在卖轮胎的店铺业务里,就算胎离了汽,它也是有意的,就可以用聚合了。在《敏捷开发》中还说到,ABA需要知道B的生存周期,即可能A负责生成或者B,或者A途径知道B的生成和放。
的代如下:

class C7 
...{
public:
    C8 theC8;

};

class C8 
...{
};

可以看到,代和聚合是一的。具体如何区,可能就只能用语义来区分了。
3
、依



:
C5可能要用到C6的一些方法,也可以这样说,要完成C5里的所有功能,一定要有C6的方法助才行。C5C6的定,一般是在C5文件中包含了C6文件。ROSE赖关系不生属性。
注意,要避免双向依。一般来,不应该存在双向依
ROSE
生成的代如下:

// C5.h
#include "C6.h"
class C5 
...{

};
// C6.h
#include "C5.h"
class C6
...{

};

ROSE不生成属性,但在形式上一般是A中的某个方法把B象作参数使用(AB)如下:

#include "B.h"
class A
...{
          
void Func(B &b);
}

那依和聚合/合、关联等有什不同呢?
关联的一种关系,例如老教学生,老公和老婆,水装水等就是一种关系。这种关系是非常明的,在问题领域中通分析直接就能得出。

是一关联,只要一个用到另一个,但是和另一个系不是太明候(可以“uses”了那个),就可以把这种关系看成是依,依也可是一偶然的系,而不是必然的系,就是我在某个方法中偶然用到了它,但在现实中我和它并没多大。例如我和子,我和子本来是没系的,但在有一次要钉钉子的候,我用到了它,就是一,依赖锤子完成钉钉件事情。

合是一整体-部分的系,在问题域中这种关系很明,直接分析就可以得出的。例如胎是的一部分,叶是的一部分,手脚是身体的一部分这种系,非常明的整体-部分系。

上述的几种关系(关联、聚合/合、依)在代中可能以指、引用、等的方式在另一个中出,不拘于形式,但在逻辑上他就有以上的区

明一下,所系只是在某个问题域才有效,离问题域,可能系就不成立了,例如可能在某个问题域中,我是一个木匠,需要拿着子去干活,可能整个问题的描述就是我拿着子怎么钉桌子,椅子,柜子;既然整个问题就是描述个,我和子就不是偶然的依赖关系了,我和子的得非常的密,可能就上升为组系(我突然想起武侠小不离身,亡人亡...)。个例子可能有点荒,但也是明一个道理,就是系和,它都是在一个问题领域中才成立的,离问题域,他可能就不存在了。

4
、泛化(承)

泛化系:如果两个存在泛化的就使用,例如父和子,物和老虎,植物和花等。
ROSE生成的代简单,如下:

#include "C11.h"
class C12 : public C11
...{
};


5
便提一下模板



上面的
图对应的代如下:

template<int>
class C13 
...{
};

里再一下重度,其看完了上面的描述之后,我们应该清楚了各个系以及具体对应到代是怎么样的,所的重度,也只不是上面的展,例如AB有着“1的重度,那在A中就有一个列表,保存着B象的N个引用,就是这样而已。

好了,到里,已把上面的类图关完了,希望你能有所收了,我也了不少工夫啊(画、生成代、截、写到BLOG上,唉,一大汗)。不如果能底理解UML类图系,也得了。:)

 
原创粉丝点击