学习 UML 笔记
前言
为了自己能快速将 UML 技术应用在软件开发的设计过程当中,特总结出如下简洁的笔记,不过只是自己学习之用,其间的用语难免不考究,正确性也日后也待验证。绘制UML的工具本人采用了开元ArgoUML工具小巧易用。
建模是开发优秀软件所有活动的核心部分,其目的就是把所设计的结构与系统的行为沟通起来,并对系统的体系结构进行可视化和控制.建模是为了真正理解正在构造的系统.
<!--[if !supportLists]--> ² <!--[endif]--> 静态图
描述了那些不发生变化的软件元素的落界结构,描绘了类、对象、数据结构及其存在于他们之间的关系。
<!--[if !supportLists]--> ² <!--[endif]--> 动态图
展示了在运行期间软件实体的变化,描绘了执行流程、实体改变状态的方法。
<!--[if !supportLists]--> ² <!--[endif]--> 物理图
显示了软件实体的不变化的物理结构描绘了物理实体有源文件、库文件、数据文件等等,以及存在于他们之间的关系。
类图属于静态图,类图也是本学习任务中的重点。
eg :
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 86.25pt" type="#_x0000_t75" o:borderrightcolor="this" o:borderbottomcolor="this" o:borderleftcolor="this" o:bordertopcolor="this"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png" o:title="" grayscale="t" gain="69719f"></imagedata><bordertop type="single" width="4"></bordertop><borderleft type="single" width="4"></borderleft><borderbottom type="single" width="4"></borderbottom><borderright type="single" width="4"></borderright></shape><!--[if !vml]--> <!--[endif]-->
解释:
‘ - ’号表示变量或者方法为私有。
‘ + ’号表示变量或者方法为公有。
‘ # ’号表示变量或者方法为受保护的。
‘:’号表示变量或者参数所属类型,在方法之后表示方法返回值类型。
类之间的关联大多用来表示变量实例持有着对其他对象的引用。
带箭头的线一般表示关系、关联,而箭头附近的数字表示含有实例的数目。而直线下方的名称表示变量或者实例的名称。
eg :
<shape id="_x0000_i1026" style="WIDTH: 388.5pt; HEIGHT: 57pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]-->
当变量(实例)的数目比较多的时,可用‘ * ’表示,一般在程序中用 vector 或者 list 表示。
<shape id="_x0000_i1027" style="WIDTH: 389.25pt; HEIGHT: 55.5pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.png" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]-->
<shape id="_x0000_i1028" style="WIDTH: 90.75pt; HEIGHT: 18pt" type="#_x0000_t75" o:ole=""><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image007.wmz" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]--> :三角型箭头表示的是继承(泛化)。
eg :
<shape id="_x0000_i1029" style="WIDTH: 390.75pt; HEIGHT: 100.5pt" type="#_x0000_t75" o:borderrightcolor="this" o:borderbottomcolor="this" o:borderleftcolor="this" o:bordertopcolor="this"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image009.png" o:title=""></imagedata><bordertop type="single" width="4"></bordertop><borderleft type="single" width="4"></borderleft><borderbottom type="single" width="4"></borderbottom><borderright type="single" width="4"></borderright></shape><!--[if !vml]--> <!--[endif]-->
[ 注意:箭头是指向基类的。 ]
如果继承接口,那么用虚线的三角型箭头。
接口被画成象一个棒棒糖的符号,并连接在实现他的类上。
eg : <shape id="_x0000_i1034" style="WIDTH: 91.5pt; HEIGHT: 67.5pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image011.png" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]-->
类的构造型显示在一对双角括号里面 ”<<>>” ,常在类的名称上面。
eg :
<shape id="_x0000_i1035" style="WIDTH: 261.75pt; HEIGHT: 54.75pt" type="#_x0000_t75" o:borderrightcolor="this" o:borderbottomcolor="this" o:borderleftcolor="this" o:bordertopcolor="this"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image013.png" o:title=""></imagedata><bordertop type="single" width="4"></bordertop><borderleft type="single" width="4"></borderleft><borderbottom type="single" width="4"></borderbottom><borderright type="single" width="4"></borderright></shape><!--[if !vml]--> <!--[endif]-->
当构造型为 <<utility>> ,那么该类的所有方法和属性都是静态的(常为工具类)。
eg :
<shape id="_x0000_i1030" style="WIDTH: 394.5pt; HEIGHT: 91.5pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image015.png" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]-->
关联的一种特殊形式,它意味着一种整体和部分( whole/part )的关系。
<shape id="_x0000_i1031" style="WIDTH: 375.75pt; HEIGHT: 57pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image017.png" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]-->
内部类在 UML 中以一个带十字的圆圈的关联标记来表示。
eg :
<shape id="_x0000_i1032" style="WIDTH: 378pt; HEIGHT: 57pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image019.png" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]-->
匿名内部类的构造型有 <<anonymous>>
交互视图描述了执行系统功能的各个角色之间相互传递<rtx w:st="on">消息</rtx>的顺序关系。类元是对在系
统内交互关系中起特定作用的一个对象的描述,这使它区别于同类的其他对象。交互视图显
示了跨越多个对象的系统控制流程。
UML 交互图以图形的形式表示出方法调用过程,它有两种形式:序列(顺序图)图( Sequence Diagram )和协作图( Collaboration Diagram )。
协作图 : 是用几何排列来表示交互作用中的各角色(如图 3 - 4 )。附在类元角色上的箭头代表<rtx w:st="on">消息</rtx>。<rtx w:st="on">消息</rtx>的发生顺序用<rtx w:st="on">消息</rtx>箭头处的编号来说明。协作图的一个用途是表示一个类操作的实现。协作图可以说明类操作中用到的参数和局部变量以及操作中的永久链。当实现一个行为时,<rtx w:st="on">消息</rtx>编号对应了程序中嵌套调用结构和信号传递过程。
序列图是一种被使用 UML 的人使用的最常用的动态建模画法。
序列图表示了对象之间传送<rtx w:st="on">消息</rtx>的时间顺序。每一个类元角色用一条生命线来表示—
即用垂直线代表整个交互过程中对象的生命期。生命线之间的箭头连线代表<rtx w:st="on">消息</rtx>。序列图可
以用来进行一个场景说明—即一个事务的历史过程。
什么时候该用序列图?只有当你迫切地需要给某人描述一组对象的如何协作的情况的时候,或者当你要为你自己可视化协作情况的时候,你再去用序列图。
什么是用例图?
用例视图是被称为参与者的外部用户所能观察到的系统功能的模型图。用例是系统中的
一个功能单元,可以被描述为参与者与系统之间的一次交互作用。用例模型的用途是列出系
统中的用例和参与者,并显示哪个参与者参与了哪个用例的执行。一个用例是有关一个系统的行为的一个描述。那个描述是从一个用户的观点编写的。
处理用例的真正诀窍是保持用例的简单,细节是不重要的,除非到了最后。把用例当作最及时的需求。在 UML 中的所有的图,用例图是最容易混淆的,也是最没有什么用的,不过系统边界图除外。
一般椭圆形表示一个一个的用例,小人表示行为者。
eg :(一个论坛<rtx w:st="on">前台</rtx>用例图)
<shape id="_x0000_i1033" style="WIDTH: 369pt; HEIGHT: 156pt" type="#_x0000_t75" o:borderrightcolor="this" o:borderbottomcolor="this" o:borderleftcolor="this" o:bordertopcolor="this"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image021.png" o:title=""></imagedata><bordertop type="single" width="4"></bordertop><borderleft type="single" width="4"></borderleft><borderbottom type="single" width="4"></borderbottom><borderright type="single" width="4"></borderright></shape><!--[if !vml]--> <!--[endif]-->
活动图是状态机的一个变体,用来描述执行算法的工作流程中涉及的活动。活动状态代表了一个活动:一个工作流步骤或一个操作的执行。活动图描述了一组顺序的或并发的活动。活动视图用活动图来体现。活动图的用途是对人类组织的现实世界中的工作流程建模。
[ 注 ] :提到状态机,那什么是状态机呢?
状态机视图 : 是一个类对象所可能经历的所有历程的模型图。状态机由对象的各个状态和连接这些状态的转换组成。每个状态对一个对象在其生命期中满足某种条件的一个时间段建模。当一个事件发生时,它会触发状态间的转换,导致对象从一种状态转化到另一新的状态。与转换相关的活动执行时,转换也同时发生。状态机用状态图来表达。
实心圆表示活动图的起点,实际上是一个占位符,带边框的实心圆表示终点。
圆角矩形表示执行的过程或活动。
菱形表示判定点。
箭头表示活动之间的转换,各种活动之间的流动次序。
箭头上的文字表示继续转换所必须满足的条件,总是使用格式 “[ 条件 ]” 来描述。
粗线条表示可能会并行进行的过程的开始和结束。
eg :
<shape id="_x0000_i1036" style="WIDTH: 333pt; HEIGHT: 276pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image023.png" o:title=""></imagedata></shape><!--[if !vml]--> <!--[endif]-->