类和类的关系涉及 依赖 关联 聚合 组合 泛化 这五种关系 ,耦合度依次递增
1.依赖
使用虚线加箭头表示
class Phone
{
public static void start(){
System.printf("手机开机")
}
};
class Man
{
public
//返回值构成依赖
return new Phone();
//形参构成依赖
void program(Phone phone);
void playGame()
{
//局部变量构成依赖
Phone phone=new Phone();
...
//静态方法调用构成依赖
Phone.star();
}
};
类A为了完成某个功能使用了类B,则类A对类B产生了依赖 ,在代码中的主要体现为 类A的某个成员函数的返回值 形参 局部变量 或者静态方法的调用,则表示类A引用了类B 用人和手机打比方 人在需要打电话的时候需要使用手机 就说明 人依赖了手机
2.关联
使用实线加箭头表示
class Wife;
class Husband {
Wife wife;
void playPhone();
}
wife类是husband类的成员变量,但是,不参与husband类的构造函数
类之间的关系比依赖强,丈夫和妻子是关联的 ,丈夫可以不玩手机,但是丈夫不能没有妻子 ,关联和依赖的相似之处,关联暗示了依赖 二者都用来表示无法使用聚合和组合表示的关系 ,关联和依赖的区别 依赖关系的两个类都不会增加属性 ,其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量,而发生关联的两个类 类A会成为类B的属性 ,而属性是一种更为紧密的耦合,更为长久的持有关系 从生命周期来看 ,依赖关系仅仅当类的方法被调用的时候产生,伴随着方法的结束而结束 ,关联关系当类实例化的时候产生,当类对象销毁的时候关系结束 关联的生存周期更长
3.聚合
聚合关系使用实线加空心菱形表示
class Girl;
class Family {
Girl girl;
Family(Girl girl ){
};
}
Girl类是Family类的成员变量,参与Family类的构造函数,在构造函数的形参当中,实例从外部传进来
聚合用来表示集体和个体之间的关联关系 ,例如家庭和女儿之间存在聚合关系
在代码上与关联关系表现一致
4.组合
组合关系使用实线加实心菱形表示
class Woter;
class Man {
Woter woter;
Man (){
woter=new Woter ();
};
}
Woter 类是Man 类的成员变量,参与Man 类的构造函数,在构造函数当中实例化,无法脱离
组合用来表示个体与组成部分之间的关联关系,例如人体和水分之间存在组合关系
组合关系和关联关系在代码上表现一致
组合和聚合的区别
聚合关系没有组合关系紧密
女儿不会因为嫁人而无法存在,聚合关系的类具有不同的生命周期,而人体没有水分将无法存活,组合关系的类具有相同的生命周期
构造函数也有不同,聚合类的构造函数中包含另一个类的实例作为参数,因为构造函数传递另一个类的实例,所以说明聚合个体可以脱离集体而独立存在,组合类的构造函数包含了另一个类的实例化,因为在构造函数中实例化,因为两者紧密联合在一起,同生同灭
信息的封装性不同
在聚合关系中,别人可以同时看到女儿和家庭,因为他们是独立的
而在组合关系中,别人看不到你的心脏,因为心脏被严密的保护在身体里
理解聚合与组合的区别,主要在于聚合的成员可独立,组合的成员必须依赖于整体才有意义。
5.泛化
泛化通俗的讲就是 类和类之间的继承关系,类和接口之间的实现关系
继承关系使用直线加空心三角形表示
类接口的实现关系使用虚线加空心三角形表示
总结
依赖关系容易区分,在编码中表现为类的成员函数的局部变量,形参,返回值或静态方法的调用
而关联,聚合,组合在编码上都以类成员变量的形式来表示,所以无法一段代码来判断,需要结合上下文语境,关联表示类之间存在联系,不存在个体与集体的关系,个体和组成部分的关系,聚合表示存在个体和集体之间的关系,组合表示存在个体和组成部分的关系。
依赖,关联,聚合,组合是逻辑上的关联,泛化是物理上的关联,所以,笼统的区分,这五种关系都是关联关系,物理上的关联是指类体上的耦合,所以泛化耦合性最强