一张图讲明白 UML 类图中的基本图示——类、接口、继承、实现...

128 阅读3分钟

UML 类图

示例

UML.png

类(class)

下图“动物”矩形框,就代表一个类(class)。

类图分为三层,第一层显示类的名称,如果是抽象类,则用斜体显示;第二层是类的特性,通常就是字段和属性;第三层是类的操作,通常是方法或行为 。 注意前面的符号,“+”表示public,“-”表示private,“#”表示protected。

class.png

abstract class Animal {
    
}

接口(interface)

下图“飞翔”表示一个接口图,与类图的区别主要是顶端有<<interface>>显示。第一行是接口名称,第二行是接口方法。接口还有另一种表示方法,俗称棒棒糖表示法,比如图中的唐老鸭类就是实现了“讲话人”的接口。

interface1.png

interface IFly {
    void fly();
}

interface2.png

interface ILanguage {
    void speak();
}

继承(extends)

动物、鸟、鸭、唐老鸭之间的关系符号表示继承关系,继承关系用==空心三角形 + 实线==来表示。

extends.png

class Bird extends Animal {
    
}

实现(implements)

大雁会飞,所以这里让它实现了飞翔接口。实现接口用==空心三角形 + 虚线==来表示。

implements.png

class WideGoose implements IFly {
    
}

关联(associatin)

企鹅和气候两个类,企鹅是很特别的鸟,会游不会飞。更重要的是,它与气候有很大的关联。企鹅需要“知道”气候的变化,需要“了解”气候规律。当一个类“知道”另一个类时,可以用关联(association)。关联关系用==实线箭头==来表示。

association.png

class Penguin extends Bird {
    // 企鹅 Penguin 持有气候 Climate 的引用
    private Climate climate;
}

聚合(aggregation)

大雁与雁群这两个类,大雁是群居动物,每只大雁都属于一个雁群,一个雁群可以有多只大雁。所以它们之间就满足聚合 (Aggregation)关系。聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。聚合关系用==空心的菱形+实线箭头==来表示。

aggregation.png

class WideGooseAggregation {
    // 在雁群 WideGooseAggregation 类中有大雁数组对象 arrayWideGoose
    private WideGoose[] arrayWideGoose;
}

合成/组合(composition)

合成(composition,也有翻译成“组合”)是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。在这里鸟和其翅膀就是合成(组合)关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。合成关系用==实心的菱形+实线箭头==来表示。

另外,你会注意到合成关系的连线两端还有一个数字“1”和数字“2”,这被称为基数。表明这一端的类可以有几个实例,很显然,一个鸟应该有两只翅膀。如果一个类可能有无数个实例,则就用“n”来表示。关联关系、聚合关系也可以有基数。

composition.png

class Bird {
    // 在鸟 Bird 类中声明一个翅膀 wing 对象
    private Wing wing;
    
    public Bird() {
        // 初始化时,示例化翅膀 wing,它们之间同时生成
        this.wing = new Wing();
    }
}

依赖(dependency)

动物几大特征,比如有新陈代谢,能繁殖。而动物要有生命力,需要氧气、水以及食物等。也就是说,动物依赖于氧气和水。它们之间是依赖关系(Dependency),用==虚线箭头==来表示。

dependency.png

abstract class Animal {
    // 依赖关系:通过参数临时使用 Oxygen、Water
    public void metabolism(Oxygen oxygen, Water, water) {
        
    }
}

好了,以上就是 UML 类图中的基本图示。“UML类图也不是一学就会的,需要有一个慢慢熟练的过 程。所谓学无止境,其实这才是理解面向对象的开始呢~。”