这是本人系统学习设计模式之前的一篇记录类之间的关系的文章。
首先感谢老师透彻的讲解,在这里我只做一些复习工作:
一、关联关系
关联关系在英文中用万能动词have可以形象的说明。
据我们对英文的了解,用到have的时候大致可以分为两种:
1)I have blue eyes. 2)I have a girlfriend.
对于第一种,我和蓝眼睛是整体和部分的关系;第二种则不是。而且,第二句话通常情况下还可以说成某某girl has a boyfriend. 他们之间存在一对一、一对多以及多对多的关系。
关联关系在代码上的实现,基本上是通过将一个类的对象写成另一个类的成员变量。以下代码表示A has B.
class ClassB {
... ...
}
class ClassA {
private ClassB b;
... ...
}
对于具备整体和部分关系的关联关系可以进一步细分为聚合关系和组合关系。
它们的共同点在于整体和部分遵守一对一或一对多的关系,都不会出现多对多关系。
区别很简单,假想聚合的聚字就是朋友间聚会的聚字,那么一句话就搞定——天下没有不散的宴席。
聚合关系的几个对象都是可以单独存在的,如汽车和轮胎、电脑和显示器。
组合关系顾名思义只有组合在一起才是个东东,这些东西一旦拆开后重用性不是很大,比如一个人和他的蓝眼睛。
在实现上两种关系更容易区别:
聚合关系的成员变量通过外部实例化好后以参数传入赋值,叫做注入。通常有两种注入:构造注入和Set注入。
class ClassB {
... ...
}
class ClassA {
private ClassB b;
... ...
/* 构造注入; */
public ClassA(ClassB b) {
this.b=b;
}
/* Set注入; */
public setB(ClassB b) {
this.b=b;
}
... ...
}
组合关系的成员变量则通过在方法体内部实例化对象。
class ClassB {
... ...
}
class ClassA {
private ClassB b;
... ...
public void method() {
... ...
b=new ClassB();
... ...
}
... ...
}
二、依赖关系
依赖关系与关联关系是不同的,用 A depend on B 记忆较为贴切。
依赖关系理解上没有障碍,在代码实现上以下有三种:
class ClassB {
public void method1(){
... ...
}
public static void method2(){
... ...
}
}
1)类A的方法需传入类B的对象;
class ClassA {
public void method(ClassB b) {
... ...
b.method1();
... ...
}
}
2)类A的方法实现时调用类B的静态方法;
class ClassA {
public void method() {
... ...
ClassB.method2();
... ...
}
}
3)类A的方法体中有类B类型的局部变量。
class ClassA {
public void method() {
... ...
ClassB b=new ClassB();
... ...
}
}
三、泛化关系
泛化关系实际上就是通常讲的那些继承啦、实现啦……