使用UML表示类关系

在上一篇责任链设计模式中,尝试画UML关系图,发现画错了。所以这里记录下,加深印象。

Generalization(继承)

UML中用带空心箭头的实线表示Generalization关系,箭头指向父类。

markdown

Interface Realzation(实现)

UML中用空心箭头的虚线表示Interface Realzation关系,箭头指向父接口

markdown

Dependency(依赖)

UML中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。

Class2依赖Class1

依赖在代码中主要体现为 Class2的某个函数的返回值、形参、局部变量或对Class1静态方法的调用,则表示Class2引用了Class1

Association(双向关联)

UML中用实线表示Association关系。

双向关联

依赖与关联的区别

  • 依赖是指其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。而发生关联关系的两个类,是指类A成为类B的全局属性

  • 从关系的生命周期来看,依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束。关联关系当类实例化的时候产生,当类对象销毁的时候关系结束。相比依赖,关联关系的生存期更长

Directed Association(单向关联)

UML中用带箭头实线表示Directed Association关系。箭头指向被关联类,即Class2拥有Class1的全局变量。

Class2关联Class1

Aggregation(聚合)

UML中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。聚合关系在代码上与关联关系表现一致

Classes has-a Student

聚合用来表示集体与个体之间的关联关系,即集体和个体是一种has-a的关系,例如班级与学生之间存在聚合关系。

Composition(组合)

UML中用带实心菱形头的实线表示Composition关系,菱形头指向整体。

Student contains-a head

组合用来表示整体与个体之间的关联关系,即整体和个体是一种contains-a的关系,例如人和头关系。

聚合与组合的区别

  • 聚合关系没有组合紧密。学生不会因为班级的解散而无法存在,聚合关系的类具有不同的生命周期,互不相干;而学生如果没有头将无法存活,组合关系的类具有相同的生命周期。

  • 在聚合关系中,可以同时了解Classes类和Student类,因为他们是独立的。在组合关系中,只认识Student类,根本不知道Head类的存在,因为头被严密地封装在学生类中。

总来说聚合的成员可独立,组合的成员必须依赖于整体才有意义。

评论