《小酌重构系列》已经完成了大约1/3了,在这些文章中,我使用了一些简单的类图来描述重构策略。在之后的文章中,我可能会借助稍微复杂一些的UML类图来介绍。但是在此之前,我觉得有必要先介绍一下UML类图中6大关系了。这6大关系分别是Inheritance(继承)、Implementation(实现)、Dependency(依赖)、Association(关联)、Aggretation(聚合)和Composition(组合)。在这6大关系中,依赖、关联、聚合和组合是比较容易混淆的,我也会讲解它们之间的区别。

UML类图简介

UML是Unified Modeling Language的缩写,翻译为中文是“统一建模语言”,它是面向对象软件的标准化建模语言。它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。

不同组织不同软件对UML的种类划分是不同的,基本所有的UML的软件都包含了以下4大种类

1. 用例图
2. 类图
3. 活动图
4. 序列图

UML类图

UML类图用于展现了一组对象、接口、协作和它们之间的关系。类图描述的是一种静态关系,在系统的整个生命周期都是有效的,是面向对象系统的建模中最常见的图。

UML工具

市面上UML的工具软件非常多,每个人的口味不同,我就不多做介绍了,我最常用的UML工具是Visio。


当然作为一个.NET开发者,Ultimate版本的Visual Studio也提供了UML建模功能。

继承和实现

继承(Inheritance)

Inheritance表示一个类(接口)继承另一个类(接口)的功能和属性,用于描述父类(接口)和子类(接口)之间的关系。
继承描述了"is a kind of "关系,例如:Manger是Employee的一种,Manager继承了Employee的所有功能(例如:刷卡签到、执行工作)和属性(例如:员工姓名、入职时间)。

在UML中,继承使用实线空心箭头表示,空心箭头指向父类(接口)。

实现(Implementation)

Implementation表示类实现接口的功能。

在UML中,继承使用虚线空心箭头表示,空心箭头指向接口。

继承和实现的区别

虽然在C#中继承和实现都使用符号:来表示(java中使用extends表示继承,implements表示实现),但二者还是有些区别的。

1. 继承发生在“类和类”或“接口和接口”之间,例如:子类继承父类,子接口继承父接口。

子类继承父类:

public abstract class Animal
{
}public class Bird : Animal
{               }

子接口继承父接口:

public interface ITransportation
{void Move();
}public interface IVehicle : ITransportation
{}

2. 实现发生在“类和接口”之间,例如:类实现某个接口的方法。

public interface IVehicle : ITransportation
{}public class Car : IVehicle
{public void Move(){Console.WriteLine("汽车跑起来...");}
}

3. 在C#中,多继承确切地说是多实现。

不像C++语言的语法,C#的类不能同时继承多个类。C#仅能继承一个类,但可以同时实现多个接口。
例如:ASP.NET MVC中的Controller类,继承了ControllerBase类,同时实现了IActionFilter, IAuthenticationFilter…等接口。

public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter,IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IAsyncManagerContainer
{
}

依赖、关联、聚合和组合

依赖(Dependency)

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

在UML中,依赖关系使用虚线箭头表示,箭头指向被依赖的一方。

例如:在Web Service中,Client需要调用Service的操作,这就表示Client依赖于Service。

关联(Association)

Association表示多个对象之间的关联关系。
每个对象都有自己的生命周期,对象之间不存在从属关系。

在UML中,关联关系使用一条直线表示。

例如:Student和Teacher之间就属于”Association”,多个Student可以关联到一个Teacher,一个Student也可以关联到多个Teacher。
但是Teacher和Student之间没有“从属”或“包含”关系。

聚合(Aggregation)

Aggregation体现的是整体和部分之间的关系,即“has-a”关系。
整体和部分是可以分离的,即整体和部分都可以拥有各自的生命周期。

在UML中,聚合关系使用空心菱形箭头表示,箭头指向整体。

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

组合(Composition)

Composition体现的也是整体和部分之间的关系,即“is-a”关系。
组合关系是更为强力的聚合关系,整体和部分是不可以分离的。
整体的生命周期结束时,也意味着部分的生命周期结束。

在UML中,组合关系使用实心菱形箭头表示,箭头指向整体。

例如:一套房屋有多个房间,房间是房屋的一部分。房间的生命周期依赖于房屋的生命周期,当房屋被拆掉时,房间也就不存在了。

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

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

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

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

分清楚这些关系有必要吗?

今天有读者问到了一个问题:分清楚这些符号有必要吗?
我的回答是:因团队而异,这取决于团队沟通和交流的方式,也取决于团队成员的能力。
UML是一种沟通语言,你可以通过它模糊地表达一段内容,你也可以准确地描述这些内容,只要团队的其他成员能够领会你的意思。
沟通是以结果为向导的,你大可不必拘泥于沟通的方式,但在沟通过程中准确有效地表达尤其重要,这里的“准确”不是指准确地使用UML符号,而是指他人能准确地领会你所表达的内容。

我个人觉得:在涉及到系统中关键的模型时,用确切的符号来表达关系仍然是比较重要的。
例如:在一个采购系统中,拥有采购申请 → 采购订单这样一个流程。采购申请由用户选择商品、供应商后创建;采购订单由审核过的采购申请生成。
这里存在3对关系:
1. 采购申请和采购申请明细的关系
2. 采购订单和采购订单明细关系
3. 采购申请和采购订单之间的关系

从业务上看,1、2是一种组合关系,3是一种关联关系。如果笼统地将1、2、3理解为依赖关系,可能会产生一些问题。
在设计过程中,如果我们正确地描述了这3对关系,那么在删除单据时,可根据确切的关系归纳出以下行为:

1. 删除采购申请时,采购申请明同时被删除(因为它们是组合关系)
2. 删除采购订单时,采购订单明细同时被删除(因为它们是组合关系)
3. 删除采购订单时,不影响采购申请(因为它们是关联关系)

关注keepfool

UML类图的6大关系相关推荐

  1. [转] UML类图的几种关系总结

    在UML类图中,常见的有以下几种关系:泛化(Generalization),实现(Realization),关联(Association),聚合(Aggregation),组合(Composition ...

  2. UML类图属性和相关关系

    UML类图 1. 类属性的可见性 描述类的属性的可见性: UML中,可见性分为4级 public 公用的 :用+ 前缀表示 ,该属性对所有类可见 protected 受保护的:用 # 前缀表示,对该类 ...

  3. UML类图、6种关系

    目录 一,类图 二,类的6种关系 1,泛化 2,实现 3,组合 4,聚合 5,关联 6,依赖 三,总结 一,类图 类图中,每个类由3个部分组成,上面的是类名,中间的是属性,下面的是方法. 属性和方法可 ...

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

    一.类的属性的表示方式 在UML类图中,类使用包含类名.属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个A类,它包含c.d两个属性,以及methodA方法. 那么 ...

  5. UML类图中类之间的关系,聚合,组合,依赖总结

    下面我就根据下面这个图来讲解一下UML类图. 类图 首先,看动物那个矩形框,他就表示为一个类(Class).类图分为三层: 第一层显示类的名称 如果是抽象类,就用斜体表示 第二层显示类的特性,通常是字 ...

  6. UML类图之六种基本关系详解

    文章目录 0. 什么是UML? 1. 依赖关系(Dependence) 1.1 什么是依赖关系? 1.2 上代码 1.3 用类图描述关系 1.4 依赖小结 2. 泛化关系(Generalization ...

  7. 【UML】例析UML类图的几种关系

    最近在学习UML,别的先不提,英文单词到是学会了不少..既然Rational Rose就是英文版的,索性我就所有东西都按照英文意思来理解,慢慢来,当初学VB的时候我也不是一下子就能记住Label的.. ...

  8. 图文并茂,详细讲解UML类图符号、各种关系说明以及举例

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | duanxz 来源 | https://www ...

  9. 详解:UML类图符号、各种关系说明以及举例

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | duanxz 来源 | https://www ...

最新文章

  1. ubantu 添加防火墙策略_企业环境下用脚本设置ubuntu防火墙
  2. js中window.location.search的用法和作用
  3. 【剑指Offer】16重建二叉树
  4. C语言中图形方式界面怎么,「分享」C语言如何编写图形界面
  5. PPT 下载 | 神策数据朱静芸:消费者全渠道精细化运营方案
  6. PHP通过URL传递session_id
  7. 安规电容能用什么代替_电容系列之安规电容
  8. sublime快捷键收藏
  9. postgresql interval 字段拼接
  10. swift版本hello
  11. Disney牵手联想发布AR头显,还有配备激光剑的AR游戏《星球大战》
  12. seo入门必备[转载]
  13. 怎样压缩PPT文件的体积
  14. 作业帮冯雪胡不归问题_【凭谁唤君胡不归作文】作业帮
  15. 建立数学模型论文写作
  16. 剑指offer(51-59题)详解
  17. 计算机网络长度,以太网中mtu默认长度 你应该知道的计算机网络知识(2)
  18. 贝壳找房户外拓展(中等) 扫描线
  19. HTML基础 冲冲冲
  20. Unity中镜像图片显示

热门文章

  1. 几个方便编程的C++特性
  2. 一次合同违约复盘(一)
  3. 基于可靠消息方案的分布式事务:Lottor介绍
  4. 如何使用Maven scope
  5. Yii框架常见问题汇总
  6. 对软件测试的认识你了解多少
  7. 让 Windows 7 定时待机
  8. 通过Image 对象动态装载图片,不可能立即得到图片的问题
  9. 第十三天-迭代器、三元表达、字典生成式、生成器、递归
  10. 视网膜脱落相关知识(持续更新中)