UML的静态建模机制包括类图、对象图和包图
类图描述系统中类的静态结构,他不仅定义系统中的类,表示类之间的关系(例如关联、依赖泛化等),还包括类的内部结构(例如类的属性和操作)。
本文总结了类图中的关系以及类图关系可能考察到的题目(转换为面向对象代码、用例图转换类图)。


文章目录

  • 类图关系
  • 概述
  • 1.依赖关系
  • 2.关联关系
  • 3.聚合关系
  • 4.组合关系
  • 5.实现关系
  • 6.泛化关系
  • 根据类图写出面向对象程序代码
  • 练习1
  • 练习2
  • 将用例图转换为类图
  • 练习1


类图关系

概述

类与类之间包含依赖、泛化、实现和关联这四种关系。其中关联关系又包含聚合关系和组合关系。

类图自动生成esclipe 类图转换成代码_软件工程

  • 泛化与实现关系,体现的是一种类与类、或类与接口的一种纵向关系
  • 依赖和关联则体现的是类与类、或者类与接口之间的引用/横向关系。
  • 强弱程度:泛化=实现>组合>聚合>关联>依赖

1.依赖关系

类图自动生成esclipe 类图转换成代码_软件工程_02

  • 依赖是两个元素之间的关系,对一个元素(提供者)的改变可能会影响或者提供消息给其他元素(客户)。也就是说,客户以某种方式依赖于提供者。
  • 比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。
  • 只要是类发生了变化引起另一个类变化,都可以说是存在依赖。

2.关联关系

类图自动生成esclipe 类图转换成代码_类图_03

  • 关联指的是类与类之间的联接,它使一个类知道另一个类的属性和方法(实例变量体现)。A类依赖于B对象,并且把B作为A的一个成员变量, 则A和B存在关联关系。
  • 关联可以是双向的,也可以是单向的。两个类之间是一个层次的,不存在部分跟整体之间的关系。
  • 例如汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。

3.聚合关系

类图自动生成esclipe 类图转换成代码_uml_04

  • 聚合关系是一种特殊的关联关系,是整体和个体之间的关系,即has-a的关系。此时整体与部分之间是可以分离的,它们可以具有各自的生命周期
  • 在聚合关联关系中,一个类是整体,它由一个或者多个部分类组成,当整体类不存在时,部分类仍然能够存在,但是当他们聚集在一起时,可以组成相应的整体类。

4.组合关系

类图自动生成esclipe 类图转换成代码_uml_05

  • 组合关系是一种特殊的关联关系,更具体的说,组合关系是一种特殊的聚合关系,它比聚合关系还要强。
  • 部分类的生命周期不独立于整体类的生命周期,即部分类不能脱离整体而单独存在
  • 例如,人的身体包括脑袋、四肢和躯干各个部分,它们与人存在一种组合关系。

5.实现关系

类图自动生成esclipe 类图转换成代码_设计模式_06

  • 实现关系指定了两个实例之间的一个合同,一个实体定义一个合同,而另一个实体保证履行该合同。
  • 指的是一个class类实现 interface接口(可以实现多个接口)的功能;实现是类与接口之间最常见的关系。
  • 在Java中此关系通过关键字implements明确标识。

6.泛化关系

类图自动生成esclipe 类图转换成代码_软件工程_07

  • 泛化关系其实就是继承关系:指的是一个类(称为子类、子接口)继承(extends)另外的一个类(称为父类、父接口)的功能,并可以增加自己额外的一些功能,继承是类与类或者接口与接口之间最常见的关系。
  • 在Java中此类关系通过关键字 extends明确标识。

根据类图写出面向对象程序代码

练习1

类图自动生成esclipe 类图转换成代码_类图_08

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

类图自动生成esclipe 类图转换成代码_软件工程_09

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

类图自动生成esclipe 类图转换成代码_类图自动生成esclipe_10


类图自动生成esclipe 类图转换成代码_类图自动生成esclipe_11