进行面向对象设计时,经常需要根据场景抽象出一些类,梳理各个类之间的关系,实现一个“低耦合,高内聚”的系统。

下面通过学生、班级、教师、学校这些角色和场景,说明面向对象中,类与类之间的六种关系

1、泛化(继承)

一个类继承另一个类,子类拥有父类的属性

继承的用处:例如学生和教师,都是属于人,都有名称、年龄、身高、体重这些共同属性,所以用学生类和教师类继承人这个类

类图如下,用实线空心三角箭头表示,子类指向父类

面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合)-LMLPHP

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、实现

使用接口去定义一个方法的参数和返回值,没有具体实现,由一个类来实现接口的方法

实现的使用:例如学生和教师,都需要知道自己在学校的信息,给学生和教师提供一个根据自己的编号查看信息的方法,可以使用一个接口定义方法,由学生和教师类实现这个方法

类图如下,用虚线空心三角形箭头表示,实现类指向接口

面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合)-LMLPHP

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

依赖的使用:例如学生犯错后,班级的班主任要给一个学生记过,即教师类修改学生信息,给教师类定义一个方法,使用学生类作为方法参数,对学生类的数据进行修改

类图如下,使用虚线箭头表示

面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合)-LMLPHP

4、关联

指一个类使用另一个类作为成员变量,如果类A使用类B作为成员变量,称类A单向关联类B,如果类B也使用类A作为成员变量,则类A与类B双向关联。关联有1:1,1:n,n:1,n:n多种关系

关联的使用:例如在学校里,每门课程都需要指定一个教师来教,而一个教师要教多门课程,所以课程与教师双向关联,所以课程:教师=n:1

类图如下,使用实线箭头表示

面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合)-LMLPHP

5、聚合

聚合指的是整体和个体之间的关系,由个体组成了一个整体,但是整体的生命周期不影响个体

聚合的使用:比如说班级和教师、学生的关系,一个班级由一群学生和教师组成了,当班级解散后,教师和学生都还存在。

类图如下,使用尾部为空心菱形的实线箭头表示

面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合)-LMLPHP

6、组合

组合跟聚合一样,指定是整体和个体之间的关系,但是在组合中,个体的生命周期和整体是一致的。

组合的使用:比如说教学楼和教室,有教学楼才有教室,如果教学楼被炸了,教室也会被炸掉。

类图如下,使用尾部为实心菱形的实线箭头表示

面向对象类图的六种关系(继承、实现、依赖、关联、聚合、组合)-LMLPHP

03-12 22:07