类图:
面向对象设计的基础就是类。类是代表现实事务或者功能的构造块。
类图是静态图,贯穿分析设计的始终。一般从商务伙伴能理解的类开始建模,最终成为只有开发小组才能理解的类。
建模类图是为了更加详细描述产品。随着反复的建模类图,类图会越来越成熟,其数量和大小会不断增加,它们会越来越详细,逐渐显示出产品中执行流的每一条路径。
类图的标记符组件:
l 类:分成三部分的矩形框,类名,特性,操作。“-”为私有,“+”为公有,“#”表示收保护
l 关联:两个类通过一条线相关联。在线上可以写关联名,比如“Teacher”类和“Class”类之间的连线上写“teach>”,表示teacher教授一个class。
l 多重性(Multiplicity):用来指示一个类的“多少”对象与另一个类的“一个”对象相关。“*”表示无限多个,通常读作“many”。多重性还可以用来显示多个范围或者数值组,用逗号隔开。
l 角色:在类图中使用角色可以帮助读者理解第一个类对于第二个类的作用。角色与多重性显示的位置类似。例如:teacher在class中扮演instructor的角色,instructor写在teacher端,同时instructor是class中的一个属性。
l 对象:它是一个带有文本Object Name:Class Name的方框,整个文本带有下划线。对象可以有特性值,在某种意义上它就唯一了。
l 包:Package Name::Class Name。例如:JasonTRoff : Wackos :: RockStar 之中,Wackos是包,RockStar是类,JasonTRoff是对象
l 聚合:一种关联。使用一端有空心菱形的连线。聚合表示两个类之间是整体与部分的关系,其中部分类可以独立于整体类而存在。例如:CPU和显示器聚合成了电脑,而CPU和显示器都可以独立存在。
l 组合:聚合的一种。使用一端有实心菱形的连线。组合表示部分类不能脱离整体类而存在,整体类消亡了部分类也消亡了。
l 泛化:
l 约束(constraint):约束可以预定义,也可以由用户定义。有两种方式为泛化建模约束:第一种,多个泛化不共用空心箭头时,用虚线穿过所有泛化的连线,并将“{约束名}”标在虚线上;第二种,多个泛化共用空心箭头,则将“{约束名}”标在箭头下。介绍几种UML中的预定义约束:(没有强制性要求使用这些约束)
1. 不完全约束(incomplete constraint):表示泛化或者子类化的类的清单是不完全的,即类图中没有完全显示出来,可以让读者知道实际内容不止眼前看到得这些。
2. 完全约束(complete constraint):读者看到得是全部内容。
3. 解体约束(disjoint constraint):表示在紧靠约束下面的泛化的类不能子类化为通用的类。也就是紧靠约束下的多个类不能有共同的子类。
4. 重叠约束(overlapping constraint):与解体约束相反,表示约束下的多个类可以共享相同的子类
l 鉴别器(discriminator):标记在箭头旁。用来说明泛化的作用。它们指示出泛化关联中的子类应用于相关超类时的角色。鉴别器不能是超类的特性名,也不能是与超类相关的任何关联的关联名。
l 有序和排序约束:可以在任何关联上使用。有序约束(ordered constraint)用来说明一个类的对象以某个次序与另一个类的对象相关。排序约束(sorted constraint)表示类中的对象在与关联中其他类的其他对象相关是排序好的。
l 导航:之前使用的关联都是双向导航。也可以使用单向导航,单向导航时一个带箭头的线。
如何建模类图:
四种方式:隐藏特性和操作(不显示特性和操作,不表示没有),只显示特性,只显示操作,同时显示特性和操作(显示了特性和操作,但是框里什么都没写,表示没有)。不显示和显示了是空的是有区别的。
特性:用来表示类持有的数据,并最终提供类的状态。
操作:用来为与建模的类相关的其他类提供功能。
如何为特性提供信息:
l 添加数据类型
l 添加初始值
l 添加多重性
l 添加派生的值:派生的值可以使用数学函数、字符串函数或者将要在应用程序中实现的其他逻辑。要想指明一个特性是派生的,需要在特性前添加一个“/”,并且要附加一个注释,注释中包含了派生特性值的指令。
如何为操作提供参数:
l 参数列表(parameter list):parameter name : data type。使用“in”“inout”“out”修饰参数,“in”表示该值为传递值,传递后的值改变不影响原值;“inout”表示该值为传递值,传递后的值改变影响原值;“out”用于值不是传递到操作,而是操作把值返回给参数的情况。
l 返回值:表示返回值类型,“操作 : 返回值类型”
l 例子:+ChangePassword( in OldPassword : String , in NewPassword : String ) : Boolean
如何建模类图:反复执行两个步骤:“确定类及其关联”、“确定特性和操作”