UML,统一建模语言,是一种用来对真实世界物体进行建模的标准标记,这个建模的过程是开发面向对象设计方法的第一步,UML不是一种方法学,不需要任何正式的工作产品。
UML提供多种类型的模型描述图,当在某种给定的方法学中使用这些图时,她使得开发中的应用程序更容易别我们所理解,UML的内涵远不只是这些模型描述图,但是对于我们来说,这些图对这门语言及其用法背后的基本原理提供了很好的介绍,通过把标准的UML图放进工作产品中,熟练UML的人员就更加容易加入项目并迅速进入角色。在UML这个大家族中用例图,类图,时序图是我们最常用的。米老师常说,学习是一个不断循环往复的过程,随着第一次文档图的验收,各位师傅的讲解,这些图在我心目中重新定义,而我对她的认识也在一步一步的加深,再一次回首用例图,类图和时序图。
首先, 我们来看一下用例图。用例图由于参与者(Actor),用例(User Case),关系,系统边界以及箭头组成,需要特别注意的是他们之间的关系,也就是泛化(Generalization),其中泛化从某种程度上可以分为扩展(Extend)和包含(Include)。扩展(Extend)是对基用例的扩展,基用例是一个完整的用例,即使没有子用例的参与,也可以完成一个完整的功能,Extend的基用例中将存在一个扩展点,只有当扩展点被激活时,子用例才能被执行。我们以为机房收费系统为例,看看扩展是如何被应用的。
在机房收费系统中,一般用户和操作员均有导出Excel这个功能,从上图中我们可以看出来操作员和一般用户扩展了导出表格这个功能,导出表格是一般用户和操作员在某些情况下触发产生的,导出表格并不是一般用户和操作员所必须存在的部分,一般用户和操作员可以单独存在,一般用户和操作员知道有导出表格这个功能的存在,但是导出表格这个功能不知道一般用户和操作员的存在,因为导出表格不知到底是谁扩展了她,一般用户和操作员是对导出表格在一些基本功能上具体的扩展。简单的来说,就是A Extend B表示B是A在系统某些情况下触发产生的,B不是A中必须存在的部分,B可以单独存在,B知道A的存在,但是A不知道B的存在,因为A不知道是谁扩展了她,B是对A在一些基本功能上具体的扩展,需要注意的是,箭头从子用例指向基用例。我们再来了解一下Include,仍然以机房收费系统为例,如下图:
Include为包含关系,当两个或多个用例中公用一组相同的动作,这是可以将这组相同的动作抽出来作为一个独立的子用例,供多个基用例共享,因为子用例被抽出,基用例并非一个完整的用例,所以Include关系中基用例必须和子用例一起使用才够完整,子用例也必然被执行。从上图中我们了解到,学生查询信息包含了学生查询余额,查看上机记录,查看充值记录以及上机状态查询,这些查询都是学生查询信息整个过程中不可或缺的一部分,注意画法,箭头从基用例指向子用例。用例图的基础理论知识就先介绍到这里,接下来,以机房收费系统为例,我修改过的用例图:
介绍完用例图,我们在来看看我们的类图,对于类图,我们要十分清楚明白的知道,类图中的四种关系,关联,依赖,泛化,实现,其中关联包括聚合和组合。首先,我们来看一下关联中的聚合,聚合,从她的字面上的意思就是大家伙聚到一起没有特别强的约束力,强调的是整体与部分之间的关系,下面我们来看一张聚合的图:
我们来看看在代码中是怎么样实现的呢?
Public class GooseGroup { public Goose goose; public GooseGroup(Goose Goose) { this.Goose=Goose; } }大雁和大雁群她们之间的关系就属于聚合关系,大雁进行迁徙的时候,一只大雁属于一个大雁群,一个雁群可以有很多大雁,大雁离开了雁群还是大雁,雁群离开了其中某一只大雁,照样还有其他的大雁,大雁可以脱离雁群独立存在。接下来,关联中的组合关系,从她的字面上,我们很容易理解,大家伙组装在一起,具有很强的约束力,下面我们来看一张组合的图:
我们再来看看组合在代码中又是如何实现的呢:
Public class Goose { public Wings wing; public Goose() { wing=new wing(); } }大雁与翅膀之间的关系就是组合,没有大雁就没有翅膀,只有翅膀也不可能是大雁,翅膀离开大雁没有了存在的意义,大雁离开了翅膀也不能构成大雁,翅膀不能脱离大雁独立存在。组合是聚合的一种形式,她具有更强的拥有关系,强调整体与部分的生命周期是一致的,整体负责部分的生命周期的管理,如果整体被销毁,部分也必须跟着一起被销毁,如果所有者被复制,部分也必须一起被复制。聚合和组成我们就先介绍到这里,预知后面的关系如何,且听下回分解,UML未完,待续(再回首UML之下篇).........