02-UML类图

绘图工具: Visio 2019

1.类与类图

在UML中, 类使用具有类名称、属性、操作(方法)分隔的长方形表示.

1.UML类图结构

  • 第1栏: 填写类名
  • 第2栏: 填写属性成员相关信息
  • 第3栏: 填写方法成员相关信息
    在这里插入图片描述
    注意: 就算属性或者方法不存在, 也要画3个栏, 并且顺序不能变, 也就是属性成员只能出现在第2栏, 方法成员只能出现在第3栏.

2.可见性符号表示

可见性(访问权限)符号表示
公有(public)+
保护(protected)#
缺省(default)*
私有(private)-

3.实例展示

如定义一个类Employee, 它包含属性name、age和email, 以及方法setName(String name)和getName().

  • 编码
public class Employee {

    private String name;

    protected int age=25;

    String email;

    public void setName(String name) {
        this.name = name;
    }
    
	public String getName() {
        return name;
    }
}
  • 图示
    在UML中该类图如下图所示.
    在这里插入图片描述

4.包含内部类的类图

因为Java语言中允许出现内部类, 所以可能会出现包含4个部分的类图, 也就是有4栏.
在这里插入图片描述

2.类之间的关系

类之间的关系有关联关系、依赖关系、泛化关系、接口与实现关系.

1.关联关系

关联关系又包括有单向关联、双向关联、自关联、多重性关联、聚合关联、组合关联.

(1)单向关联

如一个顾客拥有一个住址, 这就是一个单向关联.

  • 编码
public class Customer {
    private Address address; //住址
}
public class Address { }
  • 图示
    单向关联用一条带箭头的实线表示, 由拥有者指向被拥有物.
    在这里插入图片描述
(2)双向关联

比如你是顾客去淘宝买东西, 那么你有一个购物清单, 里面有你下单的商品. 然后卖你商品的那些商家, 他们卖給你的商品的对应记录上, 就应该也有你这位顾客的信息(商品编号:xxx, 颜色:xxx, 价格:xxx, 顾客:xxx), 这种就可以看作是双向关联.

  • 编码
public class Customer {
    private Product[] products;//购物清单
}
public class Product {
    private Customer customer; //顾客信息
}
  • 图示
    双向关联用一条实线表示.
    在这里插入图片描述
(3)自关联

简单说就是自己拥有自己, 比如单向链表, 拥有一个与自身类型相同的属性, 在C++中也就是下一个节点的指针.

  • 编码
public class Node {
    private Node next; //指向下一个节点
}
  • 图示
    自关联其实就是一种特殊的单向关联, 所以还是用带箭头的实线表示.
    在这里插入图片描述
(4)多重性关联

多重性关联, 表示一个类的对象与另一个类的对象连接的个数.

表示方式多重性说明该类的对象数取值区间举例
1..1表示另一个类的一个对象只与一个该类对象有关系[1,1]以身份证号为例,一个人只能有一个身份证号
0..*表示另一个类的一个对象与零个或多个该类对象有关系[0,∞]以宠物为例,一个人可以没有宠物, 也可以有多条宠物
1..*表示另一个类的一个对象与一个或多个该类对象有关系[1,∞]以CPU为例,一部智能手机可以只有一个CPU(单核), 也可以有多个CPU(多核)
0..1表示另一个类的一个对象与零个或一个该类对象有关系[0,1]以配偶为例, 中国法律规定, 一个人可以没有配偶, 也可以有一个配偶
m..n表示另一个类的一个对象与最少m个,最多n个该类对象有关系(m<=n)[m,n]以药物胶囊为例, 生病了吃药, 说明书上都会写上一次吃最少多少粒, 最多少粒

注意:可以看到这里符号表示的意思与E-R图的几比几的意思并不完全相同, 我们可以把它理解为是表示对象实例个数取值区间的意思.

例如, 一个界面(Form)可以有0个或多个按钮, 而一个按钮(Button)只能属于一个界面. 所以, 一个Form类的对象可以与0个或多个Button类的对象相关联, 但1个Button类的的对象只能与1个Form类的对象关联.

  • 编码
public class Form {
    private Button[] buttons;
}

public class Button {
}

  • 图示
    多重性关联和单向关联类似, 使用单向箭头的实线表示, 但是同时还要在实线的两端加上对象连接个数表示符.在这里插入图片描述
(5)聚合关系

聚合关系表示一个整体与部分的关系, 其中成员类是整体类的一部分, 即成员对象是整体对象的一部分, 但是成员对象可以脱离整体对象独立存在.

如一台计算机包含显示器、主机、鼠标、键盘等部分, 但是显示器、主机、鼠标、键盘都可以独立存在.

  • 编码
public class Computer {
    
    private Screen screen;

    public void setScreen(Screen screen) {
        this.screen = screen;
    }
}
public class Screen {
}
  • 图示
    聚合关系用实线表示, 整体类这端用空心菱形, 成员类这端用箭头.
    在这里插入图片描述
(6)组合关系

组合关系与聚合关系类似,也表示一个整体和部分的关系, 但是组合关系中的部分和整体具有统一的生存期.

例如, 人的头(Head)与嘴巴(Mouth), 其中头是一个整体, 嘴巴是头的组成部分之一, 但是如果头没了, 则嘴巴也就没了, 也就是说嘴巴并不能单独存在.

  • 编码
public class Head {
    private Mouth mouth;
    
    public Head(){
        mouth = new Mouth();
    }
}
public class Mouth {
}
  • 图示
    组合关系和和聚合关系类似, 用实线表示, 成员类这端画箭头, 但是整体类这端画的是实心菱形.

在这里插入图片描述

2.依赖关系

依赖关系是一种使用关系, 特定事物的改变有可能会影响到使用该事物的其他事物.大多数情况下, 依赖关系体现在某个类的方法使用另一个类的对象作为参数.

例如, 驾驶员开车, 在Driver类的drive()方法中将Car类型的对象car作为一个参数传递, 以便在drive()方法中能够调用car的move()方法, 且驾驶员的drive()方法依赖车的move()方法, 因此类Drive依赖类Car.

  • 编码
public class Driver {
    public void drive(Car car){
        car.move();
    }
}
public class Car {
    public void move(){}
}
  • 图示
    依赖关系用带箭头的虚线表示, 箭头指向被依赖的类.
    在这里插入图片描述

3.泛化关系

泛化关系也就是继承关系.

例如Student类和Teacher类都是Person类的子类, 它们都继承了Person类的属性和方法, 另外它们还可以额外增加自己独有的方法.

  • 编码
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(){}
}
  • 图示
    泛化关系用带空心三角形的实线表示, 空心三角形指向所继承的类这端.
    在这里插入图片描述

4.接口与实现关系

接口与实现关系描述的就是接口和实现类的关系.

例如定义了一个交通工具接口Vehicle, 其中有一个抽象操作move(), 在类Ship和类Car中都实现了move()操作, 不过具体的实现细节将会不一样.

  • 编码
public interface Vehicle {
    public void move();
}

public class Ship implements Vehicle{
    @Override
    public void move() {
        System.out.println("轮船移动");
    }
}
public class Car implements Vehicle{
    @Override
    public void move() {
        System.out.println("汽车移动");
    }
}

  • 图示
    接口与实现关系用带空心三角形的虚线表示, 空心三角形指向所实现的接口这端.
    在这里插入图片描述
    注意: 接口的图和类的图是有一点儿不同的, 接口的图在接口名称这栏的左上角是有一个接口的表示符号, 这个符号在不同的绘图软件中可能不同.Visio 2019 是用的" <<接口>> "这个符号表示.
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值