UML类图——重要

A.2 类与类的UML表示

       类(Class) 封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。

  • 在系统中每个类都具有一定的职责
    • 职责:类要完成什么样的功能,要承担什么样的义务。
  • 一个类可以有多种职责,设计得好的类通常有且仅有一种职责。
  • 在定义类的时候将类的职责分解成为类的属性和操作(即方法)。
    • 类的属性即类的数据职责。
    • 类的操作即类的行为职责。

设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。
       在软件系统运行时类将被实例化成对象(Object),对象对应于某个具体的事物,是类的实例(Instance)
       类图(Class Diagram) 使用出现在系统中的不同类来描述系统的静态结构,它用来描述不同的类以及它们之间的关系。

类的UML图示

image

public class Employee {
    private String name;
    private int age;
    private String email;

    public void modifyInfo() {
        ...
    }
}

早UML类图中,类一般由三部分组成:

  1. 类名
  2. 类的属性:类的性质。
    [可见性]名称:类型「=默认值]
    
    • 可见性:
      • 公有(public):+
      • 私有(private):-
      • 受保护(protected):#
      • 包内可见(defalut):*
    • 名称:属性名,驼峰命名法(Camel Case)
    • 类型:
      • 基本数据类型
      • 用户自定义数据类型
    • 默认值:可选项,属性的初始值。
  3. 类的操作:类的任意一个实例对象都可以使用的行为。
    [可见性]名称([参数列表])[:返回类型]
    
    • 可见性:同类的属性
    • 名称:方法名或操作名,驼峰命名法(Camel Case)
    • 参数列表:方法参数
    • 方法列表:可选项
      • 基本数据类型
      • 用户自定义类型
      • 空类型

A.3 类之间的关系(重要)

image

关联关系

关联关系(Association):结构化的关系。表示一类对象与另一类对象之间有联系。
image

public class LoginForm {
    private JButton LoginButton;
    ...
}

public class JButton{
    ...
}

双向关联

在默认情况下关联是双向的。

  • 顾客(Customer)购买商品(Product)并拥有商品;
  • 反之,卖出的商品总有某个顾客与之相关联。

因此,Customer类和 Product类之间具有双向关联关系,如图所示。

image

public class Customer {
    private Product[] products;
    ...
}

public class Product {
    private Customer customer;
    ...
}

单向关联

顾客(Customer)拥有地址(Address)。
image

public class Customer {
    private Address address;
    ...
}

public class Address {
    ...
}

自关联

一个结点类(Node)的成员又是结点Node类型的对象。
image

public class Node {
    private Node subNode;
    ...
}

多重性关联

image
一个界面(Form)可以拥有零个或多个按钮(Btutton),但是一个按钮只能属于一个界面。

  • 一个Form类的对象可以与零个或多个Button类的对象相关联
  • 一个Butto类的对象只能与一个Form类的对象关联

如图所示。
image

public class Form {
    private Button[] buttons;
    ...
}

public class Button {
    ...
}

聚合关系

汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,如图所示。

image

public class Car {
    private Engine engine;

    //构造注入
    public Car(Engine engine) {
        this.engine = engine;
    }

    //设值注入
    public void setEngine(Engine engine) {
        this.engine = engine
    }
    ...
}

public class Engine {
    ...
}

组合关系

人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,如图所示。

image

public class Head {
    private Mouth mouth;

    public Head() {
        mouth = new Mouth();
    }
}

public class Mouth {
    ...
}

依赖关系

驾驶员开车。
在Driver类的drive()方法中将Car类型的对象car作为一个参数传递,以便在drive()方法中能够调用car的move()方法。

  • 驾驶员的drive()方法依赖车的move()方法
    • 类Driver依赖类Car

如图所示。

image

public class Driver {
    public void drive(Car car) {
        car.move();
    }
    ...
}

public class Car {
    public void move() {
        ...
    }
    ...
}
  1. 最常用,将一个类的对象作为另一个类中方法的参数;
  2. 在一个类的方法中将另一个类作为局部变量,使用方法;
  3. 在一个类的方法中调用另一个类的静态方法。

泛化关系

Student类和Teacher类都是Person类的子类

  • Person类
    • 姓名(name)
    • 年龄(age)
    • 行走move()
    • 说话say()
  • Student类
    • 姓名(name)
    • 年龄(age)
    • 学号(studentNo)
    • 学习study()
  • Teacher类
    • 姓名(name)
    • 年龄(age)
    • 教师编号(teacherNo)
    • 教学teach()

如图所示。

image

public class Person {
    protected String name;
    protected int age;

    public void move() {
        ...
    }

    public void say() {
        ...
    }
}

public class Student extends Person {
    private String studentNo;

    public void study() {
        ...
    }
}

public class Teacher extends Person {
    private String teacherNO;

    public void teach() {
        ...
    }
}

接口与实现的关系

  • 接口之间也可以有与类之间关系类似的继承和依赖关系;
  • 接口和类之间还存在一种实现关系。
    image

image

public interface Vehicle {
    public void move();
}

public class Ship implements Vehicle {

    @Override
    public void move() {
        ...
    }
}

public class Car implements Vehicle {

    @Override
    public void move() {
        ...
    }
}
posted @ 2022-03-30 21:21  手持六脉神剑的外星人  阅读(129)  评论(0编辑  收藏  举报