进行面向对象设计时,经常需要根据场景抽象出一些类,梳理各个类之间的关系,实现一个“低耦合,高内聚”的系统。
下面通过学生、班级、教师、学校这些角色和场景,说明面向对象中,类与类之间的六种关系
1、泛化(继承)
一个类继承另一个类,子类拥有父类的属性
继承的用处:例如学生和教师,都是属于人,都有名称、年龄、身高、体重这些共同属性,所以用学生类和教师类继承人这个类
类图如下,用实线空心三角箭头表示,子类指向父类
Java代码的类文件,并且在Java中,如果是普通类继承一个抽象类,必须实现抽象类的所有抽象方法。
public class Person {
private Integer age;
private String name;
private Integer height;
private Integer weight;
}
public class Student extends Person {
private Integer studentNo;
}
public class Teacher extends Person{
private Integer teacherNo;
}
2、实现
使用接口去定义一个方法的参数和返回值,没有具体实现,由一个类来实现接口的方法
实现的使用:例如学生和教师,都需要知道自己在学校的信息,给学生和教师提供一个根据自己的编号查看信息的方法,可以使用一个接口定义方法,由学生和教师类实现这个方法
类图如下,用虚线空心三角形箭头表示,实现类指向接口
Java代码如下,并且在Java中,一个类可以实现多个接口
public interface QueryInterface {
/**
* 根据编号查询具体信息
* @param no
* @return
*/
Object getDetailByNo(Integer no);
}
public class Student extends Person implements QueryInterface {
@ApiModelProperty("学生编号")
private Integer studentNo;
@Override
public List<Student> getDetailByNo(Integer no) {
return null;
}
}
public class Teacher extends Person implements QueryInterface {
@ApiModelProperty("教师编号")
private Integer teacherNo;
@Override
public Teacher getDetailByNo(Integer no) {
return null;
}
}
3、依赖
指一个类在使用中依赖了另一个类,对于类A和类B,如果类A使用类B作为局部变量、方法参数或方法返回值等,则称类A依赖类B
依赖的使用:例如学生犯错后,班级的班主任要给一个学生记过,即教师类修改学生信息,给教师类定义一个方法,使用学生类作为方法参数,对学生类的数据进行修改
类图如下,使用虚线箭头表示
4、关联
指一个类使用另一个类作为成员变量,如果类A使用类B作为成员变量,称类A单向关联类B,如果类B也使用类A作为成员变量,则类A与类B双向关联。关联有1:1,1:n,n:1,n:n多种关系
关联的使用:例如在学校里,每门课程都需要指定一个教师来教,而一个教师要教多门课程,所以课程与教师双向关联,所以课程:教师=n:1
类图如下,使用实线箭头表示
5、聚合
聚合指的是整体和个体之间的关系,由个体组成了一个整体,但是整体的生命周期不影响个体
聚合的使用:比如说班级和教师、学生的关系,一个班级由一群学生和教师组成了,当班级解散后,教师和学生都还存在。
类图如下,使用尾部为空心菱形的实线箭头表示
6、组合
组合跟聚合一样,指定是整体和个体之间的关系,但是在组合中,个体的生命周期和整体是一致的。
组合的使用:比如说教学楼和教室,有教学楼才有教室,如果教学楼被炸了,教室也会被炸掉。
类图如下,使用尾部为实心菱形的实线箭头表示