设计模式:003_UML类图

159 阅读4分钟

UML 类图

类表示方式:类使用包含类名、属性和方法且带有分割线的矩形来表示。

类图作用:用于描述系统中类本身的组成以及与其他类之间的关系。

类与类之间的关系:

  • 依赖
  • 泛化(继承)
  • 实现
  • 关联
  • 聚合
  • 组合

依赖关系

如果对象 A 用到对象 B,它们之间就存在依赖关系。

代码表现形式:

  • 成员变量
  • 方法中的参数
  • 方法中的返回值
  • 方法中的局部变量
  • 调用对方的静态方法

在 UML 类图中,依赖关系用一个带虚线的箭头表示,由使用方指向被使用方,表示使用方对象持有被使用方对象的引用。

说明:成员变量通常是关联关系,甚至是关联关系的特例,比如聚合关系/组合关系,关联关系比依赖关系更强关联。

public class Car {
    public void run() {
        System.out.println("run");
    }

    public static void stop() {
        System.out.println("stop");
    }
}

public class Driver {
    // 成员变量,形成依赖关系
    private Car car;

    // 方法中的参数,形成依赖关系
    public void func1(Car car) {
        car.run();
    }

    // 方法中的返回值,形成依赖关系
    public Car func2() {
        return new Car();
    }

    // 方法中的局部变量,形成依赖关系
    public void func3() {
        Car car = new Car();
        car.run();
    }

    // 调用对方的静态方法,形成依赖关系
    public void func4() {
        Car.stop();
    }
}

泛化(继承)关系

泛化关系是指对象与对象之间的继承关系。

代码表现形式:

  • 子类继承父类

在 UML 类图中,泛化关系用空心三角和实线组成的箭头表示,从子类指向父类。

public class Linux {
}

// 泛化(继承)关系
public class Ubuntu extends Linux {
}

实现关系

实现关系是指接口及其实现类之间的关系。

代码表现形式:

  • 实现类实现接口

在 UML 类图中,实现关系用空心三角和虚线组成的箭头表示,从实现类指向接口。

public interface Linux {
}

// 实现关系
public class Ubuntu implements Linux {
}

关联关系

关联关系是指类与类之间的关联,是依赖关系的特例。

  • 关联关系具有导航性,分为单向关联、双向关联和自关联。
  • 关联关系具有多重性,可以一对一关联,也可以一对多关联。

代码表现形式:

  • 成员变量

UML 类图表示:

  • 单向关联用一个带箭头的实线表示,箭头指向被关联的对象。
  • 双向关联用一个不带箭头的实线表示。
  • 自关联用一个带有箭头且指向自身的实线表示。

单向关联,且为单向一对一关联

public class StudentID {
}

public class Student {
    public StudentID id;
}

双向关联,且为双向一对一关联

public class StudentID {
    public Student student;
}

public class Student {
    public StudentID id;
}

单向关联,且为单向一对多关联

public class Lesson {
}

public class Student {
    public Lesson math;
    public Lesson chinese;
    public Lesson english;
}

自关联

public class Node {
    public Node next;
}

聚合关系

聚合关系是关联关系的特例,体现的是整体与部分的拥有关系。

整体与部分可以分开,即整体和部分的生命周期不用保持一致。

代码表现形式:

  • 成员变量

在 UML 图中,聚合关系用空心菱形加实线箭头表示,空心菱形在整体一方,箭头指向部分一方。

public class StarLord {
}

public class Gamora {
}

public class Rocket {
}

public class Groot {
}

public class Destroyer {
}

// 银河护卫队,与角色之间的聚合关系
public class GuardiansGalaxy {
    private StarLord starLord;
    private Gamora gamora;
    private Rocket rocket;
    private Groot groot;
    private Destroyer destroyer;

    public GuardiansGalaxy() {
    }

    public void setStarLord(StarLord starLord) {
        this.starLord = starLord;
    }

    public void setGamora(Gamora gamora) {
        this.gamora = gamora;
    }

    public void setRocket(Rocket rocket) {
        this.rocket = rocket;
    }

    public void setGroot(Groot groot) {
        this.groot = groot;
    }

    public void setDestroyer(Destroyer destroyer) {
        this.destroyer = destroyer;
    }
}

组合关系

组合关系是关联关系的特例,体现的是整体与部分的包含关系。

整体与部分不能分开,即整体和部分的生命周期需要保持一致。

代码表现形式:

  • 成员变量

在 UML 图中,组合关系用实心菱形加实线箭头表示,实心菱形在整体一方,箭头指向部分一方。

public class StarLord {
}

public class Gamora {
}

public class Rocket {
}

public class Groot {
}

public class Destroyer {
}

// 银河护卫队,与角色之间的组合关系
public class GuardiansGalaxy {
    private StarLord starLord;
    private Gamora gamora;
    private Rocket rocket;
    private Groot groot;
    private Destroyer destroyer;

    public GuardiansGalaxy(StarLord starLord, Gamora gamora, Rocket rocket, Groot groot, Destroyer destroyer) {
        this.starLord = starLord;
        this.gamora = gamora;
        this.rocket = rocket;
        this.groot = groot;
        this.destroyer = destroyer;
    }
}

参考资料 zhuanlan.zhihu.com/p/109655171 www.cnblogs.com/shindo/p/55…