读书人

“组合” “聚合” “相识”的意思解决

发布时间: 2012-02-20 21:18:24 作者: rapoo

“组合” “聚合” “相识”的意思
谁能给解释解释

[解决办法]
。《设计模式》一书中没有使用“组合”这个概念,而UML表示中一般没有使用“相识”这个概念。但是两者实际上存在如下的对应关系:


《设计模式》


UML


表示的意义



聚合


组合


聚合/组合 对象和其所有者具有相同的生命周期



相识


聚合


一个对象仅仅知道另一个对象




不过,这个对应关系也不是绝对的。


1、 UML中还有一种关系叫“关联”,《设计模式》中对这种关系的说明很准确:“OMT还定义了类间的关联(association)关系,以类间的一条线来表示。关联关系是双向的。虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的,更适合表达我们所讨论的那种关系。”也可以说“关联”到代码的映射是一对多的,并且这种一对多的关系会影响到模式的选择。


2、 UML中“组合”“聚合”的概念是用来表示对象的静态结构的,因此我们可以这样认为:“组合”就是用成员变量实现的,而“聚合”就是用指向某个对象的指针来实现的。当然,这里略去了对成员函数的参数的考虑。


3、 《设计模式》中对“聚合”和“相识”的关系描述如下:“C++中,聚合可以通过定义表示真正实例的成员变量来实现,但更通常的是将这些成员变量定义为实例指针或引用;相识也是以指针或引用来实现。”“从根本上讲,是聚合还是相识是由你的意图而不是由显式的语言机制决定的。”通过这两个说明,可以看到《设计模式》中认为“聚合”和“相识”关系是运行时的动态特性,从这点上来说和UML有本质的区别。 另外,《设计模式》中对这两者动态特性描述如下:“聚合关系使用较少且比相识关系更持久;而相识关系则出现频率较高,但有时只存在于一个操作期间,相识也更具动态性,使得它在源代码中更难被辨别出来。”显然,这种描述只是说到了量的问题,而没有说到质的问题,从这里还是看不出“聚合”和“相识”到底在运行时有什么本质不同。



[解决办法]
搜索:
“组合” “聚合” “相识” 在不同场合下的意义和关系——《设计模式》读后感
[解决办法]
聚合/组合 :
聚合对象包容了被聚合对象,或者说,聚合对象控制被聚合对象的生命期,在C++中,如果被聚合对象在聚合对象中是以成员变量的形式存在的,那么二者同生同死,如果被聚合对象是以其指针方式被聚合的,它有可能是延迟构造并可能是提前析构的,即被聚合对象诞生于聚合对象之后,死于聚合对象之前。
举例说明:

class Aggeratee
{

};

class Aggerator
{
Aggeratee m_agg1;
Aggeratee* m_pagg2;
Aggeratee* m_pagg3;
public:
Aggerator()
{
m_pagg2 = new Aggeratee();
m_pagg3 = NULL;
}

~Aggerator()
{
if( m_pagg2 != NULL )
{
delete m_pagg2;
m_pagg2 = NULL;
}
}

void Initilize()
{
m_pagg3 = new Aggeratee();
}

void Destroy()
{

if( m_pagg3 != NULL )
{
delete m_pagg3;
m_pagg3 = NULL;
}
}
};

Aggerator 的实例 和 成员m_agg1,m_pagg2,m_pagg3 之间的关系就是聚合/组合的关系。
它们3个的不同之处正好说明了前面所说的不同点。

相识:

class B;
class A
{
A()
{
}
};

class B
{
A* m_pA;

public:
B(A* pA = NULL)
{
m_pA = pA;
}

void Attach(A* pA)
{
m_pA = pA;
}

void Detach()
{
m_pA = NULL;
}

~B()
{
Detach();
}
};

class A 的实例和成员m_pB所指向的对象为相识关系. 构造A时如果提供的参数pB不为NULL,则构造A的实例时,A即与参数pB所指向的对象之间建立的相识关系。如果参数pB为NULL,还可以通过Attach建立相识关系,此时一般不允许Attach函数的参数pB不能为NULL。通过Detach解除相识关系。

—— 以上纯属个人观点,欢迎交流。



[解决办法]
纠正:

class A 的实例和成员m_pB所指向的对象为相识关系. 构造A时如果提供的参数pB不为NULL,则构造A的实例时,A即与参数pB所指向的对象之间建立的相识关系。如果参数pB为NULL,还可以通过Attach建立相识关系,此时一般不允许Attach函数的参数pB不能为NULL。通过Detach解除相识关系。

-------------〉

class B 的实例和成员m_pA所指向的对象为相识关系. 构造A时如果提供的参数pA不为NULL,则构造B的实例时,B即与参数pA所指向的对象之间建立的相识关系。如果参数pA为NULL,还可以通过Attach建立相识关系,此时一般不允许Attach函数的参数pB不能为NULL。通过Detach解除相识关系。



------解决方案--------------------


现在感觉还是要学学UML的图画法

读书人网 >C++

热点推荐