在UML(统一建模语言)中,类是最基本的构造块之一,用于描述系统中的实体以及它们之间的关系。类图(Class Diagram)展示了系统中类的结构,包括类名、属性、操作(方法)以及类之间的关系。
一个典型的类在UML中的表示通常如下所示:
+------------------+
| 类名 |
+------------------+
| - 属性1 : 类型1 |
| - 属性2 : 类型2 |
| + 属性3 : 类型3 |
+------------------+
| + 方法1(参数) : 返回类型 |
| + 方法2(参数) : 返回类型 |
+------------------+
每个部分的含义如下:
类名:位于矩形的第一行,通常使用大写字母开头的名词来命名,表示类的主要职责或功能。
属性:位于矩形的第二行,列出了类的数据成员。属性前面的符号表示其可见性:
+ 表示公共(public),对外部可见;
- 表示私有(private),只在类内部可见;
# 表示受保护(protected),类自身及其子类可见。
方法:位于矩形的第三行,列出了类的行为或操作。方法的可见性与属性相同。
此外,类之间还可以定义不同的关系:
关联(Association):表示两个类之间的连接,可以通过箭头来表示导航方向。
聚合(Aggregation):一种特殊的关联,表示整体与部分的关系,但部分可以在多个整体之间共享。
组合(Composition):也是表示整体与部分的关系,但是部分不能脱离整体而存在。
泛化(Generalization):也称为继承,表示一个类(子类)从另一个类(父类)继承属性和操作。
依赖(Dependency):表示一个类使用另一个类的操作或属性,通常通过虚线箭头表示。
通过上述元素,你可以构建出详细的类图,用以描述系统的设计结构。
让我们通过一个具体的例子来展示如何使用UML类图来表示一个简单的图书管理系统中的类及其关系。
假设我们有一个简单的图书管理系统,包含以下几个类:
Book(书)
Author(作者)
Publisher(出版社)
Library(图书馆)
类定义
Book
+-------------+
| Book |
+-------------+
| - isbn: string |
| - title: string|
| - author: Author|
| - publisher: Publisher|
+-------------+
| + getIsbn(): string|
| + getTitle(): string|
| + setAuthor(author: Author): void|
| + setPublisher(publisher: Publisher): void|
+-------------+
Author
+------------+
| Author |
+------------+
| - name: string |
| - books: Set<Book> |
+------------+
| + getName(): string|
| + addBook(book: Book): void|
+------------+
Publisher
+--------------+
| Publisher |
+--------------+
| - name: string|
| - books: Set<Book> |
+--------------+
| + getName(): string|
| + addBook(book: Book): void|
+--------------+
Library
+------------+
| Library |
+------------+
| - name: string |
| - books: Set<Book> |
+------------+
| + getName(): string|
| + addBook(book: Book): void|
+------------+
类间关系
Book与Author之间是聚合关系(Aggregation),因为一本书可以有多个作者,一个作者也可以写多本书。
Book与Publisher之间是聚合关系,一本书只能由一个出版社出版,但一个出版社可以出版多本书。
Library与Book之间是聚合关系,一个图书馆可以收藏多本书。
UML类图表示
+------------+ +-------------+ +--------------+
| Author | | Book | | Publisher |
+------------+ +-------------+ +--------------+
| - name: string | | - isbn: string | | - name: string|
| - books: Set<Book>| | - title: string| | - books: Set<Book>|
+------------+ | - author: Author| +--------------+
| + getName(): string| | - publisher: Publisher|
| + addBook(book: Book): void| + getIsbn(): string|
+------------+ | + getTitle(): string|
| + setAuthor(author: Author): void|
| + setPublisher(publisher: Publisher): void|
+-------------+
+------------+
| Library |
+------------+
| - name: string |
| - books: Set<Book> |
+------------+
| + getName(): string|
| + addBook(book: Book): void|
+------------+
+------------+ o----------> +-------------+
| Author | | Book |
+------------+ +-------------+
(books)
+-------------+ o----------> +--------------+
| Book | | Publisher |
+-------------+ +--------------+
(publisher)
+------------+ o----------> +-------------+
| Library | | Book |
+------------+ +-------------+
(books)
在这个例子中,“o---------->”表示聚合关系,表明一个类拥有另一个类的对象集合。通过这种表示方式,我们可以清晰地看到各个类的属性和方法,以及它们之间的关系。这有助于理解和设计系统的整体结构。
让我们继续深入探讨这个图书管理系统中的类及其关系,并进一步完善类图和描述。
更详细的类图描述
1. Book 类
+-------------+
| Book |
+-------------+
| - isbn: string |
| - title: string|
| - author: Author|
| - publisher: Publisher|
+-------------+
| + getIsbn(): string|
| + getTitle(): string|
| + setAuthor(author: Author): void|
| + setPublisher(publisher: Publisher): void|
| + getAuthor(): Author|
| + getPublisher(): Publisher|
+-------------+
2. Author 类
+------------+
| Author |
+------------+
| - name: string |
| - books: Set<Book> |
+------------+
| + getName(): string|
| + addBook(book: Book): void|
| + removeBook(book: Book): void|
| + getBooks(): Set<Book>|
+------------+
3. Publisher 类
+--------------+
| Publisher |
+--------------+
| - name: string|
| - books: Set<Book> |
+--------------+
| + getName(): string|
| + addBook(book: Book): void|
| + removeBook(book: Book): void|
| + getBooks(): Set<Book>|
+--------------+
4. Library 类
+------------+
| Library |
+------------+
| - name: string |
| - books: Set<Book> |
+------------+
| + getName(): string|
| + addBook(book: Book): void|
| + removeBook(book: Book): void|
| + getBooks(): Set<Book>|
+------------+
类图更新
为了更详细地表示类之间的关系,我们可以更新类图如下:
+------------+ o----------> +-------------+
| Author | | Book |
+------------+ +-------------+
(books) (author, publisher)
+-------------+ o----------> +--------------+
| Book | | Publisher |
+-------------+ +--------------+
(publisher)
+------------+ o----------> +-------------+
| Library | | Book |
+------------+ +-------------+
(books)
在这个类图中:
Author 类与 Book 类之间是聚合关系,表示一个作者可以有多本书,每本书都有一个或多个作者。
Book 类与 Publisher 类之间是聚合关系,表示一本书属于一个出版社,而一个出版社可以出版多本书。
Library 类与 Book 类之间也是聚合关系,表示一个图书馆可以收藏多本书。
示例代码片段
为了更好地理解这些类是如何实现的,下面提供了一个简单的伪代码示例,展示了这些类的基本操作:
Author 类
public class Author {
private String name;
private Set<Book> books = new HashSet<>();
public Author(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void addBook(Book book) {
books.add(book);
}
public void removeBook(Book book) {
books.remove(book);
}
public Set<Book> getBooks() {
return Collections.unmodifiableSet(books);
}
}
Book 类
public class Book {
private String isbn;
private String title;
private Author author;
private Publisher publisher;
public Book(String isbn, String title) {
this.isbn = isbn;
this.title = title;
}
public String getIsbn() {
return isbn;
}
public String getTitle() {
return title;
}
public void setAuthor(Author author) {
this.author = author;
}
public void setPublisher(Publisher publisher) {
this.publisher = publisher;
}
public Author getAuthor() {
return author;
}
public Publisher getPublisher() {
return publisher;
}
}
Publisher 类
public class Publisher {
private String name;
private Set<Book> books = new HashSet<>();
public Publisher(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void addBook(Book book) {
books.add(book);
}
public void removeBook(Book book) {
books.remove(book);
}
public Set<Book> getBooks() {
return Collections.unmodifiableSet(books);
}
}
Library 类
public class Library {
private String name;
private Set<Book> books = new HashSet<>();
public Library(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void addBook(Book book) {
books.add(book);
}
public void removeBook(Book book) {
books.remove(book);
}
public Set<Book> getBooks() {
return Collections.unmodifiableSet(books);
}
}