UML类图及Java实现

1,015 阅读3分钟

我想完整记录一下Java版的设计模式的内容,本篇是关于UML类图,它与设计模式息息相关;或许这篇文章已经足够经典:30分钟学会UML类图 - 知乎 (zhihu.com);如果不嫌弃也可以看看我这个,就是比较简单直接。

本文含有仓库链接:Java-设计模式,可以结合起来学习。

为什么要学UML图?我认为这是一种逻辑的体现,普通写Demo可能没有这种感觉,但当你学到深入时,必须重温设计模式。因为很多源码的底层(例如Spring、Mybatis...)就是一种设计模式的体现,而设计模式只是一种思想,根据这种思想选择合适的设计模式并改动,最终形成底层逻辑...,读源码很痛苦,我们将其抽象成逻辑图会帮助我们理解源码设计的思路,而这一切原来就是从基础又开始的,所以...再温一遍,反反复复。

优点:

  1. 逻辑清晰,从软件工程规范的角度,应该对系统有完整的设计(没点功力还真难构建呢)
  2. 便于分工

通用

符号含义:

  • +表示 public
  • -表示 private
  • #表示 protected
  • 不带符号表示 default

用于定义一个类的属性和方法。

UML

image.png

Java

public class Person {
    private String name;

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }
}

接口

主要定义方法接口Interface,让子类去实现该接口,做到多继承或者代码规范。

UML

image.png

Java

public interface PersonMapper {
    public Person getUserByName(String userName);
}

实现

类通过implements实现Interface接口,并实现接口中的方法。

UML

image.png

Java

public class PersonMapperImpl implements PersonMapper {
    @Override
    public Person getUserByName(String userName) {
        return null;
    }
}

关联

A关联B,则B是作为A的属性存在,该属性也可以是A类中的局部变量,在局部中担属性存在。它有变种:聚合、组成、依赖。

UML

image.png

Java

public class Car {
    private Tyre tyre;
}
public class Tyre {
}

依赖

A类中某个方法的参数需要传入B这个类。

UML

image.png

Java

public class PersonController {
    public R save(Person person){
        // 保存
        return R.success();
    }
}

这两个:“ 聚合 ” 与 “ 组成 ”经常傻傻分不清楚;关联中:依赖、聚合、组成,其实都是关联的另外三种形式,都是A类中含有B类,但是特点不一样。

  1. 聚合:A类中的属性含有B类,但是一般在外部将B初始化后,通过Set的方式或者A类的有参构造方法中传入。
  2. 组成:A类中的属性含有B类,且B类的初始化一般在A类的构造方法中随着A类一块初始化,与A同生同死
  3. 依赖:一般是在A中的方法中使用,B类声明周期在A的方法中,A类本身不含B类的属性定义。

聚合

公司倒了,员工还在。

UML

image.png

Java

public class Company {
    private Person person;

    public void setPerson(Person person) {
        this.person = person;
    }
}

外部传入Person

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        Company company = new Company();
        company.setPerson(person);
    }
}

组成

心脏...是鸟的组成部分,缺它不可,“ 我亡它亡 ”。

UML

image.png

Java

public class Bird {
    private Heart heart;
    public Bird() {
        heart = new Heart();
    }
}

心脏

public class Heart {
}

继承

子类可以得到父类所有(允许访问)的属性和方法。Java是单继承。,一个子类只能extends一个父类。

UML

image.png

Java

public class Man extends Person {
    private String gender;

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

总结

UML.drawio.png