类图中的6大关系


文章目录

    • 类图中的6大关系
      • 1. 依赖关系(Dependency)
      • 2. 泛化关系(generalization)
      • 3. 实现关系(Implementation)
      • 4. 关联关系(Association)
      • 5. 聚合关系(Aggregation)
      • 6. 组合关系(Composite)
      • 7. 总结


类图中的6大关系


1. 依赖关系(Dependency)

如果在一个A类中用到了另一个B类,那么就说A类依赖B类。类图表示如下:
类图中的6大关系_第1张图片

只要B类满足下面条件中的任意一个,就说A类依赖B类:

  1. A类中用到了B类
  2. A类中有B类型的成员变量
  3. B类是A类方法的返回类型
  4. B类是A类方法的参数类型
  5. A类的方法中用到了B类

2. 泛化关系(generalization)

泛化关系可以说是继承关系,是依赖关系的特例。

用类图表示:
类图中的6大关系_第2张图片

3. 实现关系(Implementation)

B类实现了A接口,就说A接口和B类之间有实现关系,实现关系是依赖关系的特例。

用类图表示:

类图中的6大关系_第3张图片

4. 关联关系(Association)

关联关系表示的是类与类之间的联系,例如:

class Person {
    private IdCard idCard;
}
class IdCard {
    
}

在上面的代码中,Person和IdCard就是单向一对一的关系。
类图中的6大关系_第4张图片

又如:

class Person {
    private IdCard idCard;
}
class IdCard {
    private Person person;
}

在上面的代码中,我们说Person和IdCard是双向一对一的关系。

5. 聚合关系(Aggregation)

聚合关系表示的是整体和部分的关系,整体和部分是可以分开的,它是关联关系的特例。可以将聚合关系比喻为班级这样一个概念,班级由学生组成,学生可以和班级分开,离开了班级依然能够独立存在。

class Computer {
    //Computer和Monitor、Mouse是可以分离的
    private Monitor monitor;
    private Mouse mouse;

    public Computer(Monitor monitor, Mouse mouse) {
        this.monitor = monitor;
        this.mouse = mouse;
    }

}

class Monitor {
    

}

class Mouse {

}

上面的例子中,创建一个 Computer 示例需要传入一个 Monitor 实例以及一个 Mouse 实例,至于 Monitor 和 Mouse 实例在什么地方创建,什么时候创建的,和 Computer 没有关系,Computer 和 Monitor、Mouse 没有共同的生命周期。Computer 实例被销毁,Monitor 和 Mouse 实例也有可能没有销毁,因为他们是外界传入的。

用类图表示:
类图中的6大关系_第5张图片

6. 组合关系(Composite)

和聚合关系类似,组合关系关系也是用来描述整体和部分的关系,但是,它规定了部分和整体是不能分开的。可以将组合关系比喻成人和大脑、心脏的关系,在人出生的时候,必须有健康的大脑和心脏,人和大脑、心脏是患难与共的,人没了,大脑也没了。

class Computer {
    //Computer这个整体和Monitor、Mouse这两个部分是不能分离的
    private Monitor monitor = new Monitor();
    private Mouse mouse = new Mouse();
	
	public Computer(){
		monitor = new Monitor();
		mouse = new Mouse();
	} 
}

class Monitor {
    

}

class Mouse {

}

在上面的例子中,创建 Computer 实例时,就创建了 Monitor、Mouse 实例,Computer 实例和 Monitor、Mouse 实例就连为一体了,Computer 实例被销毁了,Monitor、Mouse 实例也就没了。

用类图描述:
类图中的6大关系_第6张图片

7. 总结

实现关系和泛化关系很好理解,对应于java中的实现和继承。而依赖、关联、聚合、组合这四种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。

你可能感兴趣的:(设计模式,uml类图,类图中的6大关系,设计模式,依赖关系,6大关系)