搞!UML类图

Posted 编程技术进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搞!UML类图相关的知识,希望对你有一定的参考价值。

重磅干货,第一时间送达


哈哈,同样是最近参加了一个新项目,除了 SPI,还有要看的类图也多了,嘻嘻,同样是一个小总结。这里采用代码+图的方式方便理解,差不多跟着用 ProcessOn 或者 Visio、draw.io 这类工具画一下就基本掌握了。

作为小开发一枚,类图是经常遇到的,所以下面直接上来自百度百科的 类图 解释:

类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模,也用于详细建模,将模型转换成编程代码。类图也可用于数据建模。

1、类图的表示

直入主题,上图上码!

1.1、普通类 class

代码:

public class Person {
    /** 用 - 号表示 private */
    private String name;
    /** 用 + 号表示 public */
    public String id;
    /** 用 # 表示 protected */
    protected Integer sex;
    /** 没有这表示是 Default */
    Integer age;
    
    public void setName(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

普通类图:上面的是成员变量、下面的是成员方法

搞!UML类图
普通类

+-# :类图的前缀的几个符号,看代码的解析

1.1、接口类 interface

代码

public interface Human {
    /** 接口中的成员变量必须是 public static final 的 */
    String NAME = "人类";
    /** 方法默认是 public 的 */
    void work();
    void eat();
}

接口类的类名上面有 <<interface>> 表示这是一个接口

搞!UML类图
接口类 interface

1.3、抽象类 abstract class

代码

public abstract class Programmer implements Human {
    private String language;

    @Override
    public void work() {
        System.out.println("程序员的工作:全干工程师");
    }

    abstract String getLanguage();
}

抽象类的类名和抽象方法用斜体

搞!UML类图
抽象类 Abstract

1.4、枚举 Enum

代码

public enum EnumTest {
    INSTANCE {
        @Override
        String getSay() {
            return "嘻嘻,Enum 实现的单例就是这样的搞得";
        }
    };

    public void say(){
        System.out.println(getSay());
    }

    abstract String getSay();
}

枚举的类名上面有个 << Enum>> 表示这是一个枚举

搞!UML类图
枚举 Enum

2、UML 类图中的关系表示

2.1、依赖关系

只是在类的成员方法中使用了,没有用作成员变量。用虚线的箭头表示

A的形参、局部变量、返回值、调用静态方法,则表示对 B 形成依赖。

public cLass Company {
    /**形参形成依赖*/
    public void test (XiaoMing xiaoMing){
         //局部变量也形成了依赖
         XiaoMing xiaoMing1 = new XiaoMing();
         //静态方法调用也形成了依赖
         XiaoMing. test();
    }
    /**返回值也构成依赖*/
    public XiaoMing getXiaoMing(){
       return new XiaoMing();
   }
}

图示,Compny 依赖 XiaoMing,用虚线箭头

搞!UML类图
Company 依赖 XiaoMing

2.2、关联关系

和依赖关系不同的是,关联关系有作为成员变量,这样耦合度更高,用的是实线箭头:

代码:

public class Company {
    /** 和依赖不同的是: 关联表示 XiaoMing 是 Company 的成员变量
     * A 依赖 B,仅仅是A在某个方法的形参、方法返回值、方法内的局部变量使用了 B
     **/
    XiaoMing ming;
}

图示:Company 关联 XiaoMing,用实线箭头

搞!UML类图
关联关系
关联关系之自身关联

代码:

public class ListNode {
    public ListNode next;
}

自己关联自己

搞!UML类图
自己关联自己
双向关联

代码:

public class ClassA{
    private ClassB classB;
}
public class ClassB{
    private ClassA classA;
}

图示,箭头没了

搞!UML类图
双向关联

2.3、聚合关系

聚合关系和下面的组合关系都是一种特殊的关联关系,区别在于组合的耦合度更高。

大雁群由大雁组成,所以大雁是大雁群的成员变量,所以是一种关联的关系。但大雁群必须要有大雁,这也是为什么说是一种特殊的关联关系。

但大雁不会因为离开了大雁群就无法独立存在了,大雁群不会因为某个大雁的离开就直接解散了。

同样的公司(聚合对象)和员工(被聚合对象),员工离开当前公司一样活得好好的,公司也不会因为某个员工的离职而直接倒闭(除非是最后一个员工离职)。

这里的代码用班主任和班级举例,老师不会因为不当班级主任就无法教书了,班级可以换班主任。

代码:

public cLass Teacher{}

public cLass Classes {
    /**班主任*/
    private Teacher headTeacher;
    public Classes(Teacher teacher){
        this .headTeacher = teacher;
    }
}

图示,Classes 是聚合类,Teacher 是被聚合类,空心菱形在聚合类上。被聚合对象和聚合对象有着各自的生命周期

搞!UML类图
聚合关系

2.4、组合关系:

组合关系和聚合关系对比:

  • 聚合关系:被聚合对象和聚合对象有着各自的生命周期
  • 组合关系:包含对象负责被包含对象的创建和生命周期,也就是包含对象被销毁了,被包含的对象也会被销毁

组合关系举例:

  • 人和心脏:人(包含对象)去世了心脏(被包含对象)也就跟着去世了
  • 汽车和轮胎:汽车(包含对象)报销了轮胎(被包含对象)也跟着报销了

不要说轮胎可以换到其他车上去,这里举例是为了方便理解。

组合关系和聚合关系在代码上的区别是:

  • 聚合关系:被聚合对象是外部创建传入到聚合对象
  • 组合关系:被包含对象是在包含对象中创建的(通过成员变量的初始化、构造函数的初始化等)
public class Heart {
}
public class People {
    /** 心脏 */
    private Heart heart;

    public People(){
        // 这里是构造函数的初始化
        this.heart = new Heart();
    }
}

图示:People 是包含对象,Heart 是被包含对象,实心的菱形在包含对象的一侧:

搞!UML类图
组合关系

2.5、泛化关系

超好理解,extends 就是啦

public class XiaoMing extends Programmer{
    @Override
    public void eat() {
        System.out.println("小明喜欢番茄炒蛋");
    }
    @Override
    public String getLanguage() {
        System.out.println("小明使用 Java");
        return "Java";
    }
    public static void test(){}
}

图示:用空心三角和实线

搞!UML类图
泛化关系

2.5、实现关系

也超好理解,implements 就是啦

public abstract class Programmer implements Human {
    private String language;

    @Override
    public void work() {
        System.out.println("程序员的工作:全干工程师");
    }

    abstract String getLanguage();
}

图示:用空心三角和虚线表示

搞!UML类图
实现关系

UML 类图的思维导图



往期链接