UML类图最常用的6种类间关系,分别是关联关系、依赖关系、组合关系、聚合关系、泛化关系和接口与实现关系。那这六种类间关系我们到底该如何理解,如何画图,我们废话不多说,直接开始讲解。
关联关系是类与类之间最常用的一种关系,那该如何判断什么是关联关系?一句话解释就是:全局变量就是关联关系
package org.association;
/**
* @author LOVEYOU
*/
public class ClassA {
private ClassB classB;
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassB {
}
类图用的是PlantUML,实现代码如下(可忽略)
@startuml
skinparam classAttributeIconSize 0
ClassA --> ClassB: contains
class ClassA {
- classB: ClassB
}
class ClassB {
}
@enduml
依赖关系是一种使用关系,那该如何判断什么是依赖关系?一句话解释就是:局部变量就是依赖关系
package org.association;
/**
* @author LOVEYOU
*/
public class ClassA {
public void CallB(ClassB classB) {
classB.classBMethod();
}
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassB {
public void bMethod() {
System.out.println("我是ClassB的方法");
}
}
类图用的是PlantUML,实现代码如下(可忽略)
@startuml
skinparam classAttributeIconSize 0
ClassA ..> ClassB
class ClassA {
+ callBMethod(ClassB classB): void
}
class ClassB {
+ bMethod(): void
}
@enduml
组合关系实质上是关联关系的一种,组合关系最显著的特征就是“同生共死”,如何理解?一句话解释就是:一旦整体对象不存在,那么部分对象也将不存在。
package org.association;
/**
* @author LOVEYOU
*/
public class ClassA {
private ClassB classB;
private ClassC classC;
public void ClassA() {
classB = new ClassB();
classC = new ClassC();
}
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassC {
}
类图用的是PlantUML,实现代码如下(可忽略)
@startuml
skinparam classAttributeIconSize 0
ClassA *--> ClassB: has
ClassA *--> ClassC: has
class ClassA {
-classB: ClassB
-classC: ClassC
+ClassA()
}
class ClassB {
}
class ClassC {
}
@enduml
聚合关系也是关联关系的一种,那么该如何判别聚合关系呢?一句话解释就是:聚合关系既是关联关系又是依赖关系。
package org.association;
/**
* @author LOVEYOU
*/
public class ClassA {
private ClassB classB;
public ClassA(ClassB classB) {
this.classB = classB;
}
public void setClassB(ClassB classB) {
this.classB = classB;
}
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassB {
}
类图用的是PlantUML,实现代码如下(可忽略)
@startuml
skinparam classAttributeIconSize 0
ClassA o--> ClassB: contains
class ClassA {
- classB: ClassB
+ ClassA(ClassB classB)
+ setClassB(ClassB classB): void
}
class ClassB {
}
@enduml
泛化关系也就是继承关系。一句话解释就是:Java中看到“extends”关键字就是泛化关系。
package org.association;
/**
* @author LOVEYOU
*/
public class ClassA {
public String name;
public int age;
public void aMethod() {
System.out.println("A方法");
}
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassB extends ClassA{
private int BPhoneNumber;
public void bMethod() {
System.out.println("B方法");
}
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassC extends ClassA{
private int CPhoneNumber;
public void cMethod() {
System.out.println("C方法");
}
}
类图用的是PlantUML,实现代码如下(可忽略)
@startuml
skinparam classAttributeIconSize 0
ClassA <|-- ClassB
ClassA <|-- ClassC
class ClassA {
+ name: String
+ age: int
+ aMethod(): void
}
class ClassB {
- BPhoneNumber: int
+ bMethod(): void
}
class ClassC {
- CPhoneNumber: int
+ cMethod(): void
}
@enduml
在这种关系中,类实现了接口。一句话解释就是:Java中看到“implements”关键字就是实现关系。
package org.association;
/**
* @author LOVEYOU
*/
public interface ClassA {
/**
* done
*/
void done();
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassB implements ClassA{
@Override
public void done() {
}
}
package org.association;
/**
* @author LOVEYOU
*/
public class ClassC implements ClassA{
@Override
public void done() {
}
}
类图用的是PlantUML,实现代码如下(可忽略)
@startuml
skinparam classAttributeIconSize 0
ClassA <|.. ClassB
ClassA <|.. ClassC
interface ClassA {
+ done(): void
}
class ClassB{
+ done(): void
}
class ClassC {
+ done(): void
}
@enduml
类图用的是PlantUML,实现代码如下(可忽略)
@startuml
skinparam classAttributeIconSize 0
ClassA <-- ClassB : 关联
ClassA <.. ClassB : 依赖
ClassA *-- ClassB : 组合
ClassA o-- ClassB : 聚合
ClassA <|-- ClassB: 泛化
ClassA <|.. ClassB: 实现
@enduml
Ⅰ、全局变量就是关联关系
Ⅱ、局部变量就是依赖关系
Ⅲ、“同生共死”就是组合关系
Ⅳ、关联关系+依赖关系=聚合关系
Ⅴ、Java中看到“extends”关键字就是泛化关系
Ⅵ、Java中看到“implements”关键字就是实现关系
( PlantUML 操作可以在官网查看手册,网址是:https://plantuml.com/zh/,有兴趣的小伙伴可以去看看 )