ZT UML 类与类之间的关系

1、聚合关系是关联关系的一种,是强的关联关系。    
2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。      
4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。
class 引擎 { };
class 轮胎 { };
class 汽车 {
protected:    
  引擎   engine;     
 轮胎   tyre[4];
}; 

3、合成关系 (composition):

  1、合成关系是关联关系的一种,是比聚合关系还要强的关系。     

 2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
 
 

 cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075ab425aeda76772340123b5998e8f0186ac925f75ce786a6459db0144dc0edec95152c337912afed918f0cd802592dec5a2dd4324c844040a9780804d761edd1e840341e4b19939022910ad9c32728e5b605998&p=8166d716d9c107f608e297790c4acf&newp=82368d1d86cc42a859bfc32d0214bb231610db2151ddd6102d83&user=baidu&fm=sc&query=%C0%E0%D3%EB%C0%E0%B9%D8%CF%B5+%D2%C0%C0%B5&qid=&p1=1

四、关联关系
关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性 的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类 型为被关联类B的全局变量。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标 记。
类和类之间的依赖、关联、聚合、组合关系

五、聚合关系
 

   聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于 多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇 等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。
类和类之间的依赖、关联、聚合、组合关系

六、组合关系
   组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此 时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区 分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。
七、总结
 
  对于继承、实现这两种关系没多少疑问,它们体现的是一种类和类、或者类与接口间的纵向关系。其他的四种关系体现的是类和类、或者类与接口间的引用、 横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的。前面也提到,这四种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,但 总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖

 

UML 类与类之间的关系

分类: 程序相关 348人阅读 评论(0) 收藏 举报

目录(?)[+]

类与类之间的关系对于理解面向对象具有很重要的作用,以前在面试的时候也经常被问到这个问题,在这里我就介绍一下。

类与类之间存在以下关系:      (1)泛化(Generalization)      (2)关联(Association)      (3)依赖(Dependency)      (4)聚合(Aggregation)

UML图与应用代码例子:

1.泛化(Generalization)

[泛化]

表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。

[具体表现]

父类 父类实例=new 子类()

[UML图](图1.1)

图1.1 Animal类与Tiger类,Dog类的泛化关系

[代码表现]

  1. classAnimal{}   
  2. class Tiger extends Animal{}   
  3. public class Test   
  4. {   
  5.     public void test()   
  6.      {   
  7.          Animal a=new Tiger();   
  8.      }   
  9. }

2.依赖(Dependency)

[依赖]

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。

[具体表现]

依赖关系表现在局部变量,方法的参数,以及对静态方法的调用

[现实例子]

比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作

[UML表现](图1.2)

图1.2 Person类与Screwdriver类的依赖关系

[代码表现]

  1. public class Person{   
  2.     /** 拧螺丝 */  
  3.     public void screw(Screwdriver screwdriver){   
  4.          screwdriver.screw();   
  5.      }   
  6. }  

3.关联(Association)

[关联]

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。

[具体表现]

关联关系是使用实例变量来实现

[现实例子]

比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司

[UML图] (图1.3)

图1.3 公司和员工的关联关系

[代码表现]

  1. publicclass Company{   
  2.     private Employee employee;   
  3.     public Employee getEmployee(){   
  4.         return employee;   
  5.      }   
  6.     public void setEmployee(Employee employee){   
  7.         this.employee=employee;   
  8.      }   
  9.     //公司运作   
  10.     public void run(){   
  11.          employee.startWorking();   
  12.      }   
  13. }  

(4)聚合(Aggregation)

[聚合]

当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。

[具体表现]

与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。

[关联与聚合的区别]

(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。

聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。

(2)对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整 体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和 内存)拆了下来。

[UML图](图1.4)

图1.3 电脑和组件的聚合关系

[代码表现]

  1. public class Computer{   
  2.     private CPU cpu;   
  3.     public CPU getCPU(){   
  4.         return cpu;   
  5.      }   
  6.     public void setCPU(CPU cpu){   
  7.         this.cpu=cpu;   
  8.      }   
  9.     //开启电脑   
  10.     public void start(){   
  11.         //cpu运作   
  12.          cpu.run();   
  13.      }   
******************************************************************************************************************
UML 类图中的 ”关联关系(association) “、”聚合关系(aggregation) “、”合成关系 (compostion)“ 和”依赖关系 (dependency)“ 不是很容易区分清楚,《UML distilled》 对这几个关系也没有解释的特别清楚。近日翻阅《Java 与模式》,发现其中对这些关系有较为清晰的描述,特摘录如下:

1、关联关系 (association):

1、关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。     
2、关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。      3、在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。
 class 徒弟 { };
class 唐僧 {
protected:           
 list<徒弟>   tdlist;
};
 

2、聚合关系 (aggregation):

1、聚合关系是关联关系的一种,是强的关联关系。    
2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。      
4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。
class 引擎 { };
class 轮胎 { };
class 汽车 {
protected:    
  引擎   engine;     
 轮胎   tyre[4];
}; 

3、合成关系 (composition):

  1、合成关系是关联关系的一种,是比聚合关系还要强的关系。       
 2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
class 肢 { };
class 人 {
 protected:      
 肢    limb[4];
}; 

4、依赖关系 (dependency):

1、依赖关系也是类与类之间的联结       
2、依赖总是单向的。       
3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。
 public class Person
{      
 public void buy(Car car)     
  {           ...       }
 } 

5、总结:

1、不同的关系采用不同的 UML 图例
2、对于聚合关系、合成关系,由于都是关联关系的一种,因此在不确定的情况下,可以以关联关系来描述它们
原文地址:https://www.cnblogs.com/jeanschen/p/3489192.html