1. 依赖关系
假设有A、B类,结构如下:
public class A{
private B b;
...
public B getB(){
return this.b;
}
public void reciveB(B b){
...
}
}
public class B{
...
}
由上可以看出,A类中有一个B类的私有成员变量,这就是依赖关系的体现,A类依赖B类,同时A类中还有一个getB方法,返回一个B类型变量,也可以看作是A类依赖B类,A类中还有一个reciveB方法,接收一个B类变量,这也是A类依赖B类的体现。
总而言之,只要A类中出现了B类,就可以说A类依赖B类。
2. 实现关系
这个比较简单,是用来描述接口和实现类的关系,假设有一个接口Aimpl,和一个类A,A类实现了接口Aimpl,就可以说A类是Aimpl接口的实现。
interface Aimpl{
public void doSomething();
}
public class A implements Aimpl{
public void doSomething(){
...
}
}
3. 泛化关系
这个也比较简单,泛化是用来描述继承的关系,假设有A类、B类如下:
public void A{
...
}
public void B extends A{
...
}
A类继承了B类,则称A类是B类的泛化。
4. 关联关系
关联关系是用来描述一对一或者是一对多的关系的,假设有A、B类:
public class A{
private B b;
...
}
public class B{
private A a;
...
}
A类中有一个B类引用,B类中有一个A类引用,可以认为有双向的一对一关系,关联关系也可以是单向的,例如A类中有B类引用,而B类中没有A类引用。
关联和依赖在代码的表现上虽然是一样的,但是语义环境不同,依赖侧重类的使用关系,关联侧重类之间的结构关系,在不同的业务条件下关联和依赖关系是可以互相转化的。
5. 聚合关系
聚合是用来描述语义上的整体和部分的关系,聚合表示整体和部分虽然联系在一起,但是这种关系是允许断开的。
假设A、B类,如果A和B类有聚合的关系,则A和B类至少已经有了关联的关系,聚合关系是对关联关系的进一步细分,如下示例:
public class A{
private B b;
...
public void setB(B b){
this.b = b;
}
}
public class B{
...
}
如上例,A为整体,B为部分,如果A不需要B,可以调用方法设置B为null,在不同的业务条件下,聚合关系可以转化为组合关系。
6. 组合关系
组合也是用来描述语义上的整体和部分的关系,组合表示整体和部分联系在一起且联系不允许断开,即整体和部分不能独立存在。
假设A、B类,如果A和B类有组合的关系,则A和B类至少已经有了关联的关系,和聚合关系一样,组合关系也是对关联关系的进一步细分,如下示例:
public class A{
private B b = new B();
...
}
public class B{
...
}
如上所示,A类中存在一个B类实例,如果创建一个A类实例,则在A类中肯定会有一个B类实例被创建,该B类实例不能独立存在A类之外,如果A类实例结束生命周期,则B实例也会结束其生命周期。在不同的业务条件下,组合关系可以转化为聚合关系。