洒家的窝~~

博客园 首页 联系 订阅 管理
http://blog.sina.com.cn/s/blog_5ea0192f0100dyvr.html原 文作者不详细,特此致谢!   在UML类图中的关系模式主要有以下几种: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 依赖(Dependency) 等.

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



用代码表示如下:

程序代码
// Animal.h
class CAnimal
{
public:
    // implement
    virtual HRESULT EatSomething()
    {
        // Do something
    }
};

// Tiger.h
#include "Animal.h"
class CTiger : public CAnimal
{
    // Do something
};


2. 实现(Realization)
实现关系: 是一种类与接口的关系, 表示类是接口所有特征和行为的实现. 见下图:



用 代码表示如下:

程序代码
// Animal.h
class CAnimal
{
public:
    // interface
    virtual HRESULT EatSomething() = 0;
};

// Tiger.h
#include "Animal.h"
class CTiger : public CAnimal
{
    // Do something
};


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

3. 关联(Association)
关 联关系: 是一种拥有的关系, 可以分为双向关联, 单向关联和自身关联.
双向关联是指双方都拥有对方的引用, 都可以调用对方的公共属性和方法. 见下图:



用 代码表示如下:

程序代码
// Husband.h
#include "wife.h"
class CHusband
{
public:
    CWife* pWife;
};

// Wife.h
#include "Husband.h"
class CWife
{
public:
    CHusband* pHuband;
};


上图中丈夫和妻子是比较公平的关系, 都可以使用对方公共的属性.

单向关联是指 只有某一方拥有另一方的引用, 这样只有拥有对方者可以调用对方的公共属性和方法. 如下图:



用 代码表示如下:

程序代码
// Husband.h
class CHusband
{
public:
    int nMoney;
    void GoShopping();
};

// Wife.h
#include "Husband.h"
class CWife
{
public:
    CHusband* pHuband;
};


上图中妻子拥有 丈夫, 可以使用对方的属性, 比如钱, 可以让对方做能做的事, 比如去买东西.

自身关联是指拥有一个自身的引用. 如下图



用代码表示如下:

程序代码
// SingleMan.h
class CSingleMan
{
public:
    CSingleMan *pSingleMan;
};


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



用代码表示如下:

程序代码
// Car.h
#include "Tyre.h"
class CCar
{
public:
    CTyre cTyre;
};

// Tyre.h
#include "Car.h"
class CTyre
{
    // Do something
};


程序代码
// Company.h
#include "Department.h"
class CCompany
{
public:
    CDepartment cDepartment;
};

// Tyre.h
#include "Company.h"
class CDepartment
{
    // Do something
};


5. 依赖(Dependency)
依赖关系: 是一种使用的关系,  即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖. 如下图:



用 代码表示如下:

程序代码
// Car.h
class CCar
{
    // Do something
};

// Person.h
#include "Car.h"
class CPerson
{
    void MoveFast(CCar &pCar);
};



上图中人的快速移动需要有车的协助, 但是这种依赖是比较弱的, 就是人也可以不用车而用其他工具, 与关联不同的是人不必拥有这辆车只要使用就行.

 

 

这是我得出的耦合强度:(不一定正确)

依赖(dependency)  -- 关联(association) -- 聚合(aggregate) -- 组合(composition) -- 泛化(generalization)

 

 

//////////////////////////////////////////////////////////////////////////////////////////

关联、组合、聚合、依赖关系比较

    类之间的关系种类: Generalization(泛化),Dependency(依赖关系)、Association(关联关系)、Aggregation(聚合关系)、 Composition(合成关系)。
    其中Aggregation(聚合关系)、Composition(合成关系)属于Association(关联关系),是特殊的Association 关联关系。Generalization(泛化)表现为继承或实现关系(is a)。具体形式为类与类之间的继承关系,接口与接口之间的继承关系,类对接口的实现关系。


     Association关联系表现为变量(has a )。类与类之间的联接,它使一个类知道另一个类的属性和方法。例如如果A依赖于B,则B体现为A的全局变量。关联关系有双向关联和单向关联。双向关联:两 个类都知道另一个类的公共属性和操作。单向关联:只有一个类知道另外一个类的公共属性和操作。大多数关联应该是单向的,单向关系更容易建立和维护,有助于 寻找可服用的类。



    Aggregat ion(聚合关系) 是关联关系的一种,是强的关联关系。聚合关系是整体和个体的关系。普通关联关系的两个类处于同一层次上,而聚合关系的两个类处于不同的层次,一个是整体, 一个是部分。同时,是一种弱的“拥有”关系。体现的是A对象可以包含B对象,但B对象不是A对象的组成部分。具体表现为,如果A由B聚合成,表现为A包含 有B的全局对象,但是B对象可以不在A创建的时刻创建。



    Composition(组合关系)是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。 Composition(组合关系)是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一致。如果A由B组成,表现为A包含有 B的全局对象,并且B对象在A创建的时刻创建。


Dependency(依 赖关系)表现为函数中的参数(use a)。是类与类之间的连接,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。例如如果A依赖于B,则B体现为局部变量,方法的参数、 或静态方法的调用。

posted on 2010-04-17 06:47  tianxu0836  阅读(1176)  评论(0编辑  收藏  举报