UML类图中的六大关系:关联(单向、双向、自关联)、聚合、组合、依赖、继承、实现

一、类的属性的表示方式

在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个A类,它包含c、d两个属性,以及methodA方法。
在这里插入图片描述
那么属性/方法名称前加的加号和减号是什么意思呢?它们表示了这个属性或方法的可见性,UML类图中表示可见性的符号有三种:

· + :表示public

· - :表示private

· #:表示protected(friendly也归入这类)
属性的完整表示方式如下:
可见性 名称 :类型 [ = 缺省值]

方法的完整表示方式如下:
可见性 名称(参数列表) [ : 返回类型]

属性与方法中括号中的内容是可选的。

一、简介
在UML类图中,类之间的关系可以分成:关联(association)、聚合(aggregation)、组合(composition)、依赖(dependency)、泛化(generalization)/继承(inheritance)和实现(realization)。这六种关系如下图所描绘:
在这里插入图片描述
上面的关系可以解读如下:
(关联)Association:A类有B类有逻辑上的连接
(聚合)Aggregation : A类有一个B类
(组合)Composition : A类拥有一个B类
(依赖)Dependency : A类使用了B类
(继承)Inheritance : B类是一个A类 (或者B类扩展A类)
(实现)Realization : B类实现了接口A
本篇文章主要是展示在Java中如何表示这些关系 ,以便我们可以更好地理解这些关系并且知道如何以及何时使用每一种关系。

二、关联(association)
关联描述两个类之间行为的一般二元关系。例如,一个学生选修一门特定的课程是学生类Student和课程类Course之间的一个关联,而一个教师教授一门课程是师资类Faculty和课程类Course之间的一个关联。Java代码中,关联可以用属性和方法来实现。

public class Student {
    private Course[] courses;

          
    public void addCourse(Course s) {
        . . . . . .
    } }

public class Course {
    private Strudent[] students;
    private Faculty faculty;

    public void addStudent(Student s) {
        . . . . . .
    }

    public void setFaculty(Faculty faculty) {
        this.faculty = faculty;
    } }

public class Faculty {
    private Course[] courses;
           
    public void addCourse(Course s) {
        . . . . . .
    }  }

三、聚合(Aggregation)
聚合是一种特殊的关联(Association)形式,表示两个对象之间的所属(has-a)关系。所有者对象称为聚合对象,它的类称为聚合类;从属对象称为被聚合对象,它的类称为被聚合类。例如,一个公司有很多员工就是公司类Company和员工类Employee之间的一种聚合关系。被聚合对象和聚合对象有着各自的生命周期,即如果公司倒闭并不影响员工的存在。


public class Company {
    private List<Employee> employees;
}

public class Employee {
    private String name;   
}

四、组合(Composition)
聚合是一种较弱形式的对象包含(一个对象包含另一个对象)关系。较强形式是组合(Composition). 在组合关系中包含对象负责被包含对象的创建以及生命周期,即当包含对象被销毁时被包含对象也会不复存在。例如一辆汽车拥有一个引擎是汽车类Car与引擎类Engine的组合关系。下面是组合的一些例子。

   (1)通过成员变量初始化   
public class Car {
    private final Engine engine = new Engine();       
}

class Engine {
    private String type;
}
  (2)通过构造函数初始化  
public class Car {
    private final Engine engine;  
       
    public Car(){
       engine  = new Engine();
    }
}

public class Engine {
    private String type;
}
  (3)通过延迟初始化
public class Car {	
    private final Engine engine;  
    public Engine getEngine() {
        if (null == engine) {
            engine = new Engine();
        }
        return engine;
    }     
}

public class Engine {
    private String type;
}

五、依赖(Dependency)
依赖(Dependency)描述的是一个类的引用用作另一个类的方法的参数。例如,可以使用Calendar类中的setTime(Date date)方法设置日历,所以Calendar和Date之间的关系可以用依赖描述。

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {

    public final void setTime(Date date) {
        setTimeInMillis(date.getTime());
    }
      
    . . . . . .
}
   在依赖关系中,类之间是松耦合的。

六、继承(Inheritance)
继承(Inheritance)模拟两个类之间的is-a关系。强是(strong is-a)关系描述两个类之间的直接继承关系。弱是(weak is-a)关系描述一个类具有某个属性。强是关系可以用类的继承表示。例如,Spring的ApplicationEvent是一个EventObject,ApplicationEvent和EventObject间就是一种强是关系,可以用继承描述。

public abstract class ApplicationEvent extends EventObject {
    . . . . . .
**}

七、实现(Realization)**
实现(Realization)描述的是一个类实现了接口(可以是多个)。上面描述的弱是(weak is-a)关系就可以用接口表示。例如字符串是可以被序列化的,这就可以用实现来描述。

public final class String  implements java.io.Serializable, Comparable<String>, CharSequence {
    . . . . . .
}

八、参考资料
http://usna86-techbits.blogspot.com/2012/11/uml-class-diagram-relationships.html
http://javarevisited.blogspot.com/2014/02/ifference-between-association-vs-composition-vs-aggregation.html

  • 6
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值