强弱关系:依赖<关联<聚合<组合<实现<继承
一、依赖VS关联
依赖
定义:是一种使用的关系,即一个类的实现需要另一个类的协助.。就好比动物依赖氧气和水
图形:虚线+箭头,指向被使用者
可描述为:Uses a
依赖是类的六种关系中耦合最小的一种关系
在生成代码的时候,这两个关系类都不会增加属性
代码对应:方法参数、方法中的局部变量、静态方法调用
1. abstract class Animal 2. { 3. public Metabolism(Oxygen oxygen,Water water) 4. { 5. 6. } 7. }
关联
定义:是一种拥有的关系,它使一个类知道另一个类的属性和方法。比如企鹅需要知道气候的变化
关联可以是双向关联,也可以是单向关联。双向关联可以有两个箭头或者没有箭头,单向关联有一个箭头
图形:实线+箭头,指向被拥有者
单向关联:
双向关联:
可描述为:Has a
关联关系用实线,表示类之间的耦合度比依赖强
在生成代码的时候,关联关系的类会增加属性
代码对应:成员变量
1. class Penguin : Bird 2. { 3. private Climate climate;//在企鹅Penguin中,引用到气候Climate对象 4. }
总结:依赖和关联之间的关系是什么?
1、从类的属性是否添加的角度看
(1)发生依赖关系的两个类都不会增加属性,其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已
(2)发生关联关系的两个类,其中一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系
2、从关系的生命期角度看
(1)依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束
(2)关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长
二、聚合VS组合
聚合
定义:是整体与部分的关系,且部分可以离开整体而单独存在,体现的是A对象可以包含B对象,但B对象不是A对象的一部分, 就好比大雁离开了雁群
图形:空心的菱形+实线箭头,菱形指向整体
类之间的耦合关系比组合弱
代码对应:成员变量
1. class WideGoseAggregate 2. { 3. private WideGoose[] arrayWideGoose;//在雁群WideGooseAggregate类中,有大雁数组对象arrayWideGoose 4. }
组合
定义:是整体与部分的关系,但部分不能离开整体而单独存在,比如鸟有两只翅膀,如果两只翅膀离开了鸟的话,翅膀就没有作用了
图形:实心的菱形+实线箭头,菱形指向整体
组合关系的练习两端还有一个数字‘1’和数字‘2’,这被称为基数。表名这一端的类可以有几个实例。如果一个类可以有无数个实例,那就用‘n’来表示
类之间的耦合关系比聚合强
代码对应:成员变量
1. class Bird 2. { 3. private Wing wing; 4. public Bird() 5. { 6. wing = new Wing();//在鸟Bird类中,初始化时,实例化翅膀Wing,它们之间同时生成 7. } 8. }
总结:聚合和组合的区别
1、构造函数不同
聚合类的构造函数中包含了另一个类作为参数。雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数传递进来。大雁类(Goose)可以脱离雁群类而独立存在
组合类的构造函数中包含了另一个类的实例化。表明大雁类在实例化之前,一定要先实例化翅膀类(Wings),这两个类紧密的耦合在一起,同生共灭。翅膀类(Wings)是不可以脱离大雁类(Goose)而独立存在
2、信息的封装性不同
在聚合关系中,客户端可以同时了解雁群类和大雁类,因为它们都是独立的
在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中
三、继承VS实现
继承
定义:表示类与类,类与接口之间的关系表示父子关系(鸟、兔子 都是动物,继承动物)
图形:空心三角形+实线,箭头指向父类
可描述为:Is a
泛化也称继承,子类将继承父类的所有属性和方法,并且可以根据需要对父类进行拓展
代码对应:
1. class Bird : Animal //鸟类继承动物类 2. { 3. 4. }
实现
定义:是一种类与接口的关系,表示类是接口所有特征和行为的实现
图形:带三角箭头的虚线,箭头指向接口
代码对应:
1. class WideGoose :IFly //实现飞翔接口 2. { 3. 4. }