类之间的关系主要由泛化、实现、依赖、关联、聚合、组合。下面重点对后面几种关系进行描述。
1. 泛化(Generalization)
泛化表示一般和特殊的关系。在Java语言中,它代表父类和子类的关系。
- 伪代码:
class Animal {}
class Bird extends Animal {}
在UML中,使用空心的三角形表示。
上面类图中,动物和小鸟是一般和特殊关系。
2. 实现(Realization)
实现表示类和接口的关系。
- 伪代码:
interface Eraser {
void remove();
}
class Pencil implements Eraser {
public void remove() {
System.out.println("铅笔橡皮擦...");
}
}
在UML中,实现关系使用带虚线的空心三角形表示。
上面Eraser
接口和Pencil
类是一种实现关系。Java中实现某个接口,说明该类具有了该接口中的所有能力。
3. 依赖(Dependency)
依赖关系表示的是一种使用关系,比如说读书。
- 伪代码:
public Student {
String name;
public void read(Book book) {
System.out.println(this.name + "坐在马桶上读" + book.getTitle());
}
}
在UML中,依赖关系使用带虚线的箭头表示。
上面学生类的read
方法所在的Student
类依赖了Book
类。
通常类的方法通过参数、返回值、局部变量引用被依赖的类。
4. 关联(Association)
关联关系是一种拥有的关系,比如说小明有一只猫。在实际业务场景中,比如说A类应用了一个全局变量XxxProperties
,那么A类就关联了XxxProperties类。
- 伪代码:
class A {
XxxProperties xxxProperties;
public void test() {
String val = xxxProperties.getSomething();
...
}
}
在UML中,关联关系使用箭头表示。
关联关系有两个比较特殊的情况:聚合和组合,它们都是代表整体和部分的关联关系。如果从业务上区分,聚合是将一个大的业务拆分成许多不同的小业务;组合是将一个业务划分为不同步骤一起完成。如果从被关联实例的生命周期上区分,聚合关系中的整体和部分是互相独立的,即使关联实例不存在,被关联实例也不会受影响;组合关系中的部分是依赖整体而存在的,如果关联实例不存在了,那么被关联的实例也随之消失。
5. 聚合(Aggregation)
聚合关系是关联关系的一种情况。它代表的是整体和部分的关系。具体到实际业务场景的话,一个大的业务可能由许多小的业务组成。比如说通用支付业务,它包含了微信支付、支付宝支付、银联支付等。这里的通用支付就聚合了各种不同的支付渠道。
- 伪代码:
class GeneralPayService {
WxPayService wxPayService;
AliPayService aliPayService;
UnionPayService unionPayService;
public String pay(String payType) {
if ("wx".equals(payType)) {
wxPayService.pay();
} else if ("ali".equals(payType)) {
alipayService.pay();
} else if ("union".equals(payType)) {
unionPayService.pay();
}
...
}
}
在UML中,聚合关系是使用空心的菱形来表示。
6. 组合(Composition)
组合关系也是关联关系的一种情况。具体到实际业务场景的话,一个大的业务可能由一系列的步骤来完成。比如说购票业务,它是由查票、下单、支付步骤等一系列步骤来完成,那么它们之间的关系就是聚合关系。
- 伪代码:
class BuyTicketBusiness {
TicketService ticketService;
OrderService orderService;
PayService payService;
public String buyTicket(String ticketId) {
// 第一步:查票
Ticket ticket = ticketService.queryTicketById(ticketId);
// 第二步:创建订单
String orderNo = orderService.createOrder(ticket);
// 第三步:支付
String result = payService.pay(orderNo);
...
}
}
在UML中,组合关系使用实心菱形来表示。