设计模式之UML关系图 UML类图符号 各种关系说明以及举例 UML类图的6大关系

什么是UML图,在这里我就不赘述了,园子里有很多介绍UML图的文章。

UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。

  • 依赖Dependency:元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。
  • 泛化(Generalization:通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。
  • 实现(Realize:元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。
  • 关联(Association:元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。
  • 聚合(Aggregation:关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
  • 合(Composition:组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。

其中关系由强到弱:泛化>实现>组合>聚合>关联>依赖

一、依赖(Dependency)

表示方法:虚线加箭头表示

依赖关系是对象之间最基本的关系,也是类与类之间的联结。当一个对象(调用者)需要调用另外一个对象(被调用者)的方法去完成某些工作时,依赖关系就建立了。

依赖总是单向的。(Tips: 要避免双向依赖。一般来说,不应该存在双向依赖。

依赖关系在 C#(Java、C++等)中体现为局部变量、方法的参数或者对静态方法的调用

  (软件开发中,往往会设计一些公用类,供别的类调用,如果这些公用类出问题了,那调用这些公用类的类都会因此而出问题。 

两个元素之间的一种关系,其中一个元素(提供者)的变化将影响另一个元素(客体),或向它提供所需信息显示一个类引用另一个类)

扫描二维码关注公众号,回复: 5494399 查看本文章
public class Client
{
    // 方法的参数
    void call(Service service)
    {
        // 局部变量
        // Service service = new Service();
        // 静态方法调用
        // Service.Call();
       ...
    }
} 

  

  特点:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。

  Client依赖Service,但是Client变动不会影响Service。但是Service变动可能会影响Client(如上Service的Call方法变动一定会影响Client)。

二、关联(Association)

  表示方法:实线箭头表示

  

关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。

关联可以是双向的,也可以是单向的(Tips:还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

依赖关系在 C#(Java、C++等)中体现为成员变量(属性),但是没有包含关系

public class Teacher
{
     
}
public class Student
{  
    protected List<Teacher> thList { get; set; };
}

  表示方法:实线箭头

  特征:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示。(A类有一个成员变量保存的是B类的一个引用,也就是说由A类可以找到B类)

  Student关联Teacher,可以通过Student找到Teacher。Student和Teacher每有包含关系。

三、聚合(Aggregation)

  表示方法:带空心菱形箭头表示

 

聚合关系是关联关系的一种,是强的关联关系,体现的是整体和部分之间的关系,即“has-a”关系

聚合是整体和部分之间的关系,例如部门由员工组成。

在 C#(Java、C++等)中体现为成员变量(属性)。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。

public class Employee
{

}
public class Department
{
    protected List<Employee> ElList { get; set; };
}

一个Department拥有多个Employee,Department作为整体,Department中的Employee是Department的一部分。
Department和Employee都有自己的生命周期,当一个Department被撤销时,Employee可以转到其他Department或离职了。
Employee转到其他Department或离职时,Department仍然是存在的。  

  表示方法:空心菱形头

  特征:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联;

四、组合(Composition)

  表示方法:带实心菱形头的实线表示

  组合关系是关联关系的一种,是比聚合关系还要强的关系,体现的也是整体和部分之间的关系,即“is-a”关系

  它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

  简单来说就是C#(JAVA、C++等)中的属性。两者之间有组成关系。

class Heart
{
} 
class Person
{ 
    Heart heart { get; set; }; 
}

  心脏是人的组成部分,不可单独存在。

  特征:属于是关联的特殊情况,也体现了体现部分-整体关系,是一种强“拥有关系”;整体与部分有相同的生命周期,是一种强关联;

五、 泛化(Generalization)

  表示方法带空心箭头的实线线表示

   

  泛化(下图)表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。

  简单来说就是C#(JAVA、C++等)中的继承一般用于类继承类

  泛化关系表示类与类之间的继承关系。如父和子、老虎和动物及植物和花等。

  如下图: 

public class Employee
{
}
public class Professor : Employee
{
}

六、实现(Realization)

  表示方法:空心箭头和虚线表示

  实例(I)关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。

  简单来说就是C#(JAVA、C++等)中的实现一般用于类实现接口

表达一种说明元素与实现元素之间的关系;

public interface IVehicle
{
    void Move();
}

public Car : IVehicle
{
    public void Move()
    {
    }
}

                  图I

依赖、关联、聚合和组合的区别

  依赖、关联、聚合和组合都可以泛指为”依赖关系”。
  当对象之间构成关联(Association)、聚合(Aggregation)或组合(Composition)关系时,也建立了对象之间的依赖关系。
  它们表现的依赖关系强弱程度不同,这4种关系所表现的强弱程度依次为:组合(Composite) > 聚合(Aggregation) > 关联(Association) > 依赖(Dependency)。

  关联、聚合和组合是大家经常容易混淆的3种关系,这种关系最大的区别在于对象的生命周期。

  1. 关联关系:每个对象都有自己的生命周期,对象之间不存在从属关系 
  2. 聚合关系:整体和部分是可以分离的,整体和部分都可以拥有各自的生命周期 
  3. 组合关系:整体和部分是不可以分离的,整体的生命周期结束时,也意味着部分的生命周期结束。

 泛化与实现就是C#(Java,C++)中的继承与实现,这两个不难理解。

 参考文献:

 UML类图符号 各种关系说明以及举例

 UML类图的6大关系

使用工具:

 UML: https://www.processon.com

猜你喜欢

转载自www.cnblogs.com/maplebridge/p/10486113.html