UML的静态建模机制包括类图、对象图和包图。
类图描述系统中类的静态结构,他不仅定义系统中的类,表示类之间的关系(例如关联、依赖泛化等),还包括类的内部结构(例如类的属性和操作)。
本文总结了类图中的关系以及类图关系可能考察到的题目(转换为面向对象代码、用例图转换类图)。
文章目录
- 类图关系
- 概述
- 1.依赖关系
- 2.关联关系
- 3.聚合关系
- 4.组合关系
- 5.实现关系
- 6.泛化关系
- 根据类图写出面向对象程序代码
- 练习1
- 练习2
- 将用例图转换为类图
- 练习1
类图关系
概述
类与类之间包含依赖、泛化、实现和关联这四种关系。其中关联关系又包含聚合关系和组合关系。
- 泛化与实现关系,体现的是一种类与类、或类与接口的一种纵向关系。
- 依赖和关联则体现的是类与类、或者类与接口之间的引用/横向关系。
- 强弱程度:泛化=实现>组合>聚合>关联>依赖。
1.依赖关系
- 依赖是两个元素之间的关系,对一个元素(提供者)的改变可能会影响或者提供消息给其他元素(客户)。也就是说,客户以某种方式依赖于提供者。
- 比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。
- 只要是类发生了变化引起另一个类变化,都可以说是存在依赖。
2.关联关系
- 关联指的是类与类之间的联接,它使一个类知道另一个类的属性和方法(实例变量体现)。A类依赖于B对象,并且把B作为A的一个成员变量, 则A和B存在关联关系。
- 关联可以是双向的,也可以是单向的。两个类之间是一个层次的,不存在部分跟整体之间的关系。
- 例如汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。
3.聚合关系
- 聚合关系是一种特殊的关联关系,是整体和个体之间的关系,即has-a的关系。此时整体与部分之间是可以分离的,它们可以具有各自的生命周期。
- 在聚合关联关系中,一个类是整体,它由一个或者多个部分类组成,当整体类不存在时,部分类仍然能够存在,但是当他们聚集在一起时,可以组成相应的整体类。
4.组合关系
- 组合关系是一种特殊的关联关系,更具体的说,组合关系是一种特殊的聚合关系,它比聚合关系还要强。
- 部分类的生命周期不独立于整体类的生命周期,即部分类不能脱离整体而单独存在。
- 例如,人的身体包括脑袋、四肢和躯干各个部分,它们与人存在一种组合关系。
5.实现关系
- 实现关系指定了两个实例之间的一个合同,一个实体定义一个合同,而另一个实体保证履行该合同。
- 指的是一个class类实现 interface接口(可以实现多个接口)的功能;实现是类与接口之间最常见的关系。
- 在Java中此关系通过关键字implements明确标识。
6.泛化关系
- 泛化关系其实就是继承关系:指的是一个类(称为子类、子接口)继承(extends)另外的一个类(称为父类、父接口)的功能,并可以增加自己额外的一些功能,继承是类与类或者接口与接口之间最常见的关系。
- 在Java中此类关系通过关键字 extends明确标识。
根据类图写出面向对象程序代码
练习1
class Student{
name;
address;
phoneNumber;
emailaddress;
studentNumber;
averageMark;
void getSeminarsTaken{}
}
class Enrollment{
markRecieved;
Student[] s;
void getAverageToDate(){}
void getFinalMark(){}
void enrolled(Student[] s){
this.s=s;
}
}
class Professor{
name;
address;
phoneNumber;
emailAddress;
salary;
}
class Seminar{
name;
seminar Number;
fees;
Student[] s;
Professor[] f;
void AddStudent(Student s){
this.s.append(s);
}
void dropStudent(Student s){
this.s.remove(s);
}
void instruct(Professor[] f){
this.f=f;
}
}
练习2
class User {
String name;
String email;
String password;
List<Cart> carts;
public User(List<Cart> carts,String name, String email, String password) {
this.name = name;
this.email = email;
this.password = password;
this.carts = carts;
}
}
class Product {
int id;
String name;
double price;
public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
}
class Cart {
List<Product> products;
public void addProduct(Product product) {
this.products.add(product);
}
public double getTotalPrice() {
double totalPrice = 0;
for (Product product : this.products) {
totalPrice += product.price;
}
return totalPrice;
}
}
public class Main {
public static void main(String[] args) {
User user = new User("John Doe", "johndoe@example.com", "password");
Cart cart = new Cart(user);
Product product1 = new Product(1, "iPhone 13 Pro Max", 10999);
Product product2 = new Product(2, "MacBook Pro M2", 14999);
cart.addProduct(product1);
cart.addProduct(product2);
System.out.println(cart.getTotalPrice());
}
}
将用例图转换为类图
练习1