一、依赖关系(Dependence)
只要是在 类中用到了对方,那么它们之间就存在依赖关系。如果没有对象,连编译都通过不了。
Demo:
public class PersonServiceBean {
//类
private PersonDao personDao;
public void save(Person person) {
}
public IDCard getIDCard(Integer personid) {
return new IDCard();
}
public void modify() {
Department department = new Department();
}
}
public class PersonDao {}
public class Person {}
public class IDCard {}
public class Department {}
对应的类图:
![](https://files.mdnice.com/user/27110/5d9667b0-53ad-4df4-8d6e-dfa8d907c410.png)
![](https://files.mdnice.com/user/27110/1f7bef23-12e3-4d9e-9862-0a7afe6e3c81.png)
小结:
- 类中用到了对方;
- 如果是类的成员属性;
- 如果是方法的返回类型;
- 是方法接收的参数类型;
- 方法中使用到;
二、泛化关系(Generalization)
泛化关系实际上就是继承关系,它是依赖关系的特例。
Demo:
public class DaoSupport {
public void save(Object entity){}
public void delete(Object id){}
}
public class PersonServiceBean extends DaoSupport{
}
对应的类图:
![](https://files.mdnice.com/user/27110/2ed149c5-83f1-4bff-9af6-5cf04e3e5686.png)
![](https://files.mdnice.com/user/27110/2994fda9-4432-4466-9dfe-00bb83b9edb1.png)
小结:
- 泛化关系实际上就是继承关系;
- 如果 A 类继承了 B 类,我们就说 A 和 B 存在泛化关系;
三、实现关系(Implementation)
实现关系实际上就是 A 类实现 B 接口,它是依赖关系的特例。
Demo:
public interface PersonService {
public void delete(Integer id);
}
public class PersonServiceBean implements PersonService {
@Override
public void delete(Integer id) {
System.out.println("delete..");
}
}
对应的类图:
![](https://files.mdnice.com/user/27110/07632289-30db-4443-8f78-6e5b0670f002.png)
![](https://files.mdnice.com/user/27110/c3b8feb4-2764-48a2-9d91-3aea7ab3d95f.png)
四、关联关系(Association)
关联关系实际上就是 类与类之间的联系,它是依赖关系的特例。
关联具有导航性:即双向关系或单向关系。
关系具有多重性:如“1”(表示有且仅有一个),“0” (表示 0 个或者多个),“0,1”(表示 0 个或者一个),“n...m”(表示 n 到 m 个都可以),“m...*” (表示至少 m 个)。
Demo:
public class Person {
private IDCard card; //单向关系
private Home home; //双向关系
}
public class IDCard {}
public class Home {
private Person person;
}
对应的类图:
![](https://files.mdnice.com/user/27110/a137319d-1770-4f98-9e2b-2c02b1920348.png)
五、聚合关系(Aggregation)
聚合关系表示的是 整体和部分的关系,整体与部分可以分开。
聚合关系是关联关系的特例,所以它具有关联的导航性和多重性。
如:一台电脑由键盘(keyboard)、显示器(monitor),鼠标等组成,组成电脑的各个配件是可以从电脑上分离出来的,使用带空心菱形的实线来表示。
Demo:
public class Computer {
private Mouse mouse; //鼠标可以和computer分离
private Moniter moniter;//显示器可以和Computer分离
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
public void setMoniter(Moniter moniter) {
this.moniter = moniter;
}
}
public class Moniter {}
public class Mouse {}
对应的类图:
![](https://files.mdnice.com/user/27110/daa470f6-fe70-4666-b598-4d4eefdaea7e.png)
![](https://files.mdnice.com/user/27110/cb50bb86-3dcb-4616-b7be-80c9ee4c55ad.png)
六、组合关系(Composition)
如果像人和头部,心脏不可分离的,则升级为组合关系。
组合关系:也是整体与部分的关系,但是整体与部分不可以分开。
案例:在程序中我们定义实体: Person 与 IDCard、 Head, 那么 Head 和 Person 就是组合, IDCard 和 Person 就是聚合。
但是如果在程序中 Person 实体中定义了对 IDCard 进行级联删除,即删除 Person 时连同 IDCard 一起删除, 那么 IDCard 和 Person 就是组合了。
Demo:
public class Person {
private IDCard card; //聚合关系
private Head head = new Head(); //组合关系
}
public class IDCard {}
public class Head {}
对应的类图:
![](https://files.mdnice.com/user/27110/414e1043-1a1e-4599-b9ea-a4b9db01bb96.png)
![](https://files.mdnice.com/user/27110/de4fcce1-7025-4474-b3ab-4fb6680c6eec.png)
Demo2:
public class Computer {
/**鼠标可以和computer不能分离**/
private Mouse mouse = new Mouse();
/**显示器可以和Computer不能分离**/
private Moniter moniter = new Moniter();
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
public void setMoniter(Moniter moniter) {
this.moniter = moniter;
}
}
public class Mouse {}
public class Moniter {}
对应的类图:
![](https://files.mdnice.com/user/27110/84b2d6f6-a765-46db-86a4-c9a3bff5bb18.png)
![](https://files.mdnice.com/user/27110/5ee73246-fbe1-4601-81bf-40a93f70b3a2.png)