我正在尝试学习UML概念及其在Java编程中的应用。我知道关联,共享聚合和组合概念。我感到困惑的是它们如何应用于特定场景。例如如果我们有一组三个类:Book,Author和Publisher,我们如何应用这些概念。
Book.java
class Book {
private String ISBN;
private String category;
private Publisher publisher;
private ArrayList<Author> authors;
}
Author.java
class Author {
private String authorName;
private String phoneNo;
private String email;
private ArrayList<Book> books;
}
Publisher.java
class Publisher {
private String publisherName;
private String publisherAddress;
private ArrayList<Book> books;
}
这些仅仅是协会吗?我们可以说Publisher和Book之间的关系是共享聚合吗? Book-Author之间有很多关系呢?
对我而言,Publisher-Book似乎是一个共享聚合,Book-Author是一个简单的关联。如果有一个章节类,与一本书有关,那就是作文。我的理解是对的吗?
答案 0 :(得分:1)
Association,Aggregation和Composition都是“有”关系。
关联意味着两个类彼此关联,但每个类的实例可以彼此独立存在。您的示例显示没有简单的关联。
聚合是一种特殊的关联,其中一个类包含另一个类的集合。作者有很多书,出版社有很多书等。
组合是一种特殊的聚合,意味着强大的生命周期联系。换句话说,组合类通常不能存在于父类之外。例如,没有Map,Map.Entry就不能存在。你没有上述例子。
您还应该意识到,与UML相关的“组合”比Java更严格/更窄。
答案 1 :(得分:1)
根据UML超结构规范,v2.4.1(见下文),&#34;共享聚合&#34;在UML中没有特别定义。因此,它是否共享取决于模型以及它是否是复合模型取决于存在的管理方式。
&#34; AggregationKind是以下文字值的枚举:
none - 表示该属性没有聚合。 shared - 表示该属性具有共享聚合。 composite - 表示属性是复合聚合的,即复合对象负责组合对象(部件)的存在和存储。
语义变化点 - 共享聚合的精确语义因应用领域和建模者而异。&#34;
答案 2 :(得分:0)
虽然Book
和Author
之间存在多对多关联,但Book
和Publisher
之间存在多对一关联。
在Java类中,您一直使用两对互反向引用属性Book::authors
和Author::books
以及Book::publisher
和Publisher::books
。这是实现双向关联的模式。
有关关联的更多信息,请参阅my tutorial about associations的第1部分。