正文

UML类图关系2010-01-18 19:53:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/manbuyuduan/50588.html

分享到:

  在1997年, 对象管理组织(Object Management Group) 发布了统一建模语言UML(Unified Modeling Language). UML的目标之一就是为开发团队提供标准通用的设计语言来开发和构建计算机应用. UML提出了一套IT专业人员期待多年的统一的标准建模符号. 通过使用UML, 这些人员能够阅读和交流系统架构和设计规划--就像建筑工人多年来所使用的建筑设计图一样.  到2003年以后, UML已经获得了业界的认同. 下面主要对UML类图的几种关系模式简要说明:      在UML类图中的关系模式主要有以下几种: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 依赖(Dependency) 等.1. 泛化(Generalization)      泛化关系: 是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为. 老虎是动物的一种, 即有老虎的特性也有动物的共性.  见下图:用代码表示如下: view plaincopy to clipboardprint? // Animal.h    class CAnimal    {    public:        // implement        virtual HRESULT EatSomething()        {            // Do something        }    };       // Tiger.h    #include "Animal.h"    class CTiger : public CAnimal    {        // Do something    };  // Animal.h class CAnimal { public: // implement virtual HRESULT EatSomething() { // Do something } }; // Tiger.h #include "Animal.h" class CTiger : public CAnimal { // Do something }; 2. 实现(Realization)实现关系: 是一种类与接口的关系, 表示类是接口所有特征和行为的实现. 见下图:用代码表示如下: view plaincopy to clipboardprint? // Animal.h    class CAnimal    {    public:        // interface        virtual HRESULT EatSomething() = 0;    };       // Tiger.h    #include "Animal.h"    class CTiger : public CAnimal    {        // Do something    };  // Animal.h class CAnimal { public: // interface virtual HRESULT EatSomething() = 0; }; // Tiger.h #include "Animal.h" class CTiger : public CAnimal { // Do something }; 注: 泛化和实现的区别就在于子类是否继承了父类的实现, 如有继承则关系为泛化, 反之为实现.3. 关联(Association)关联关系: 是一种拥有的关系, 可以分为双向关联, 单向关联和自身关联.双向关联是指双方都拥有对方的引用, 都可以调用对方的公共属性和方法. 见下图:用代码表示如下: view plaincopy to clipboardprint? // Husband.h    #include "wife.h"    class CHusband    {    public:        CWife* pWife;    };       // Wife.h    #include "Husband.h"    class CWife    {    public:        CHusband* pHuband;    };  // Husband.h #include "wife.h" class CHusband { public: CWife* pWife; }; // Wife.h #include "Husband.h" class CWife { public: CHusband* pHuband; }; 上图中丈夫和妻子是比较公平的关系, 都可以使用对方公共的属性.单向关联是指只有某一方拥有另一方的引用, 这样只有拥有对方者可以调用对方的公共属性和方法. 如下图:用代码表示如下: view plaincopy to clipboardprint? // Husband.h    class CHusband    {    public:        int nMoney;        void GoShopping();     };       // 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; }; 上图中妻子拥有丈夫, 可以使用对方的属性, 比如钱, 可以让对方做能做的事, 比如去买东西.自身关联是指拥有一个自身的引用. 如下图用代码表示如下: view plaincopy to clipboardprint? // SingleMan.h    class CSingleMan    {    public:        CSingleMan *pSingleMan;    };  // SingleMan.h class CSingleMan { public: CSingleMan *pSingleMan; }; 4. 聚合(Aggregation)和组合(Composition)聚合关系: 是整体与部分的关系, 且部分可以离开整体而单独存在. 如车和轮胎是整体和部分的关系, 轮胎离开车仍然可以存在.组合关系: 是整体与部分的关系, 但部分不能离开整体而单独存在. 如公司和部门是整体和部分的关系, 没有公司就不存在部门.用代码表示如下: view plaincopy to clipboardprint? // Car.h    #include "Tyre.h"    class CCar    {    public:        CTyre cTyre;    };       // Tyre.h    #include "Car.h"    class CTyre    {        // Do something    };  // Car.h #include "Tyre.h" class CCar { public: CTyre cTyre; }; // Tyre.h #include "Car.h" class CTyre { // Do something }; view plaincopy to clipboardprint? // Company.h    #include "Department.h"    class CCompany    {    public:        CDepartment cDepartment;    };       // Department.h    #include "Company.h"    class CDepartment    {        // Do something    };  // Company.h #include "Department.h" class CCompany { public: CDepartment cDepartment; }; // Department.h #include "Company.h" class CDepartment { // Do something }; 5. 依赖(Dependency)依赖关系: 是一种使用的关系,  即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖. 如下图:用代码表示如下: view plaincopy to clipboardprint? // Car.h    class CCar    {        // Do something    };       // Person.h    #include "Car.h"    class CPerson    {        void MoveFast(CCar &pCar);    };  // Car.h class CCar { // Do something }; // Person.h #include "Car.h" class CPerson { void MoveFast(CCar &pCar); }; 上图中人的快速移动需要有车的协助, 但是这种依赖是比较弱的, 就是人也可以不用车而用其他工具, 与关联不同的是人不必拥有这辆车只要使用就行.

阅读(3257) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册