UML 类图 & 种与类之间的关系

UML 类图 & 类与类之间的关系
        原文出处:http://www.iteye.com/topic/37302
        参考文章:http://dev.firnow.com/course/3_program/rg/2007921/72614.html

        类与类之间存在以下几种关系:     
  • 泛化(Generalization)
  • 依赖(Dependency)
  • 关联(Association)
  • 聚合(Aggregation)
  • 合成(composition)

        1. 泛化(Generalization)
        表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。

        ● 具体表现
        父类 父类实例 = new 子类();

        ● UML 类图(图1.1)
UML 类图 & 种与类之间的关系
        图1.1 Animal 类与 Tiger 类,Dog 类之间的泛化关系

        ● 代码表现
class Animal {
    ...
}

class Tiger extends Animal {
    ...
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Tiger;
    }
}


        2. 依赖(Dependency)
        对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
        (1) 依赖关系也是类与类之间的联结。
        (2) 依赖总是单向的。
        (3) 依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。

        ● 具体表现
        依赖关系表现在局部变量,方法的参数,以及对静态方法的调用。

        ● 现实例子
        比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作。

        ● UML 类图(图1.2)
UML 类图 & 种与类之间的关系
        图1.2 Person 类与 Screwdriver 类的依赖关系

        ● 代码表现
public class Person {
    public void doScrew(Screwdriver screwdriver) {
        // Person 借助 Screwdriver 来完成 screw 的操作
        screwdriver.screw();
    }
}


        3. 关联(Association)
        对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
        ① 关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
        ② 关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
        ③ 在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。

        ● 具体表现
        关联关系是使用实例变量来实现。

        ● 现实例子
        比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司。

        ● UML 类图(图1.3)
UML 类图 & 种与类之间的关系
                      图1.3 公司和员工的关联关系

        ● 代码表现
public class Compnay {
    private Employee employee;

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    // 公司运作
    public void run() {
        employee.startWorking();
    }
}


        3. 聚合(Aggregation)
        当对象 A 被加入到对象 B 中,成为对象 B 的组成部分时,对象 B 和对象 A 之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。
        (1) 聚合关系是关联关系的一种,是强的关联关系。
        (2) 聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
        (3) 聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。
        (4) 对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和内存)拆了下来。

        ● 具体表现
        与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。

        ● UML 类图(图1.4)
UML 类图 & 种与类之间的关系
                          图1.4 电脑和组件的聚合关系

        ● 代码表现
public class Computer {
    private CPU cpu;
    private MainBoard mainBoard;
    private Memory memory;

    public void run() {
        mainBoard.start();
        memory.start();
        cpu.start();
    }
    
}


        5. 合成(composition)
        (1) 合成关系是关联关系的一种,是比聚合关系还要强的关系。
        (2) 它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

        ● 具体表现
        同聚合类似。关联关系和合成关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。

        ● UML 类图(图1.5)
UML 类图 & 种与类之间的关系
                          图1.5 人和人的各个部分之间的关系

        ● 代码表现
public class 人 {
    private 肢 limb[4];
}


        ● 总结
        (1) 不同的关系采用不同的 UML 图例。
        (2) 对于聚合关系、合成关系,由于都是关联关系的一种,因此在不确定的情况下,可以以关联关系来描述它们。