UML类图——重要
A.2 类与类的UML表示
类
类(Class) 封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。
- 在系统中每个类都具有一定的职责
- 职责:类要完成什么样的功能,要承担什么样的义务。
- 一个类可以有多种职责,设计得好的类通常有且仅有一种职责。
- 在定义类的时候将类的职责分解成为类的属性和操作(即方法)。
- 类的属性即类的数据职责。
- 类的操作即类的行为职责。
设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。
在软件系统运行时类将被实例化成对象(Object),对象对应于某个具体的事物,是类的实例(Instance)。
类图(Class Diagram) 使用出现在系统中的不同类来描述系统的静态结构,它用来描述不同的类以及它们之间的关系。
类的UML图示
public class Employee {
private String name;
private int age;
private String email;
public void modifyInfo() {
...
}
}
早UML类图中,类一般由三部分组成:
- 类名
- 类的属性:类的性质。
[可见性]名称:类型「=默认值]
- 可见性:
- 公有(public):+
- 私有(private):-
- 受保护(protected):#
- 包内可见(defalut):*
- 名称:属性名,驼峰命名法(Camel Case)
- 类型:
- 基本数据类型
- 用户自定义数据类型
- 默认值:可选项,属性的初始值。
- 可见性:
- 类的操作:类的任意一个实例对象都可以使用的行为。
[可见性]名称([参数列表])[:返回类型]
- 可见性:同类的属性
- 名称:方法名或操作名,驼峰命名法(Camel Case)
- 参数列表:方法参数
- 方法列表:可选项
- 基本数据类型
- 用户自定义类型
- 空类型
- 无
A.3 类之间的关系(重要)
关联关系
关联关系(Association):结构化的关系。表示一类对象与另一类对象之间有联系。
public class LoginForm {
private JButton LoginButton;
...
}
public class JButton{
...
}
双向关联
在默认情况下关联是双向的。
- 顾客(Customer)购买商品(Product)并拥有商品;
- 反之,卖出的商品总有某个顾客与之相关联。
因此,Customer类和 Product类之间具有双向关联关系,如图所示。
public class Customer {
private Product[] products;
...
}
public class Product {
private Customer customer;
...
}
单向关联
顾客(Customer)拥有地址(Address)。
public class Customer {
private Address address;
...
}
public class Address {
...
}
自关联
一个结点类(Node)的成员又是结点Node类型的对象。
public class Node {
private Node subNode;
...
}
多重性关联
一个界面(Form)可以拥有零个或多个按钮(Btutton),但是一个按钮只能属于一个界面。
- 一个Form类的对象可以与零个或多个Button类的对象相关联
- 一个Butto类的对象只能与一个Form类的对象关联
如图所示。
public class Form {
private Button[] buttons;
...
}
public class Button {
...
}
聚合关系
汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,如图所示。
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),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,如图所示。
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
如图所示。
public class Driver {
public void drive(Car car) {
car.move();
}
...
}
public class Car {
public void move() {
...
}
...
}
- 最常用,将一个类的对象作为另一个类中方法的参数;
- 在一个类的方法中将另一个类作为局部变量,使用方法;
- 在一个类的方法中调用另一个类的静态方法。
泛化关系
Student类和Teacher类都是Person类的子类
- Person类
- 姓名(name)
- 年龄(age)
- 行走move()
- 说话say()
- Student类
姓名(name)年龄(age)- 学号(studentNo)
- 学习study()
- Teacher类
姓名(name)年龄(age)- 教师编号(teacherNo)
- 教学teach()
如图所示。
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() {
...
}
}
接口与实现的关系
- 接口之间也可以有与类之间关系类似的继承和依赖关系;
- 接口和类之间还存在一种实现关系。
public interface Vehicle {
public void move();
}
public class Ship implements Vehicle {
@Override
public void move() {
...
}
}
public class Car implements Vehicle {
@Override
public void move() {
...
}
}