面向对象编程中,类封装数据与行为,接口定义行为规范。UML通过图形表示这些概念及其关系:类以矩形展示,分名称、属性、方法三部分;接口类似但仅含操作。关系包括泛化(继承)、实现、依赖、关联、聚合和组合,用于描述类间不同形式的互动与结构连接。
基本概念
包
封装是唯一一个分组事物可收集结构和行为的东西,简单来说,包就像一个“文件夹”,把文件“代码”组织起来。
类是指具有相同属性、方法、关系和语义的对象的集合。类在UML中,第一个框是类的名称,第二个框是属性,第三个框是方法名。
属性:可见性 名称 :类型 [ = 缺省值]
方法:可见性 名称(参数列表) [ : 返回类型]
中括号表示缺省的
可见性使用+ - #表示
- public
- private
protected
~表示default,也就是包权限
_下划线表示static
斜体表示抽象
接口
接口是指类或组件所提供的服务,描述了类或组件对外可见的动作。接口在UML中,第一个框是类的名称,第二个框是方法名。
类与类间关系
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)
2.1泛化
介绍:
泛化(Generalization)表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系
(1)继承
介绍:
继承表示是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
表示方法:
继承使用空心三角形+实线表示。
示例:
鸟类继承抽象类动物
(2)实现
介绍:
实现表示一个class类实现interface接口(可以是多个)的功能。
表示方法:
1)矩形表示法
使用空心三角形+虚线表示
比如:大雁需要飞行,就要实现飞()接口
2)棒棒糖表示法
使用实线表示
2.2依赖
介绍:
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
表示方法:
依赖关系用虚线箭头表示。
示例:
动物依赖氧气和水。调用新陈代谢方法需要氧气类与水类的实例作为参数
2.3关联
介绍:
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
表示方法:
关联关系用实线箭头表示。
示例:
企鹅需要‘知道’气候的变化,需要‘了解’气候规律。当一个类‘知道’另一个类时,可以用关联。
2.4聚合
介绍:
表示一种弱的‘拥有’关系,即has-a的关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。 两个对象具有各自的生命周期。
表示方法:
聚合关系用空心的菱形+实线箭头表示。
示例:
每一只大雁都属于一个大雁群,一个大雁群可以有多只大雁。当大雁死去后大雁群并不会消失,两个对象生命周期不同。
2.5组合
介绍:
组合是一种强的‘拥有’关系,是一种contains-a的关系,体现了严格的部分和整体关系,部分和整体的生命周期一样。
表示方法:
组合关系用实心的菱形+实线箭头表示,还可以使用连线两端的数字表示某一端有几个实例。
示例:
鸟和翅膀就是组合关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。
类图语法
一、类图(class)
1、类(名称、属性、方法)(抽象类)
点击类后,右下角将isAbstract勾选就是抽象类,类名会成斜体
2、属性类型与范围
属性的设置:点击一个属性,右下角可以设置,其中Type为属性类型,同时也有静态方法的设置
3、方法参数类型与范围、返回值类型
方法的参数:点击方法,左上角添加参数,选中参数进行相关设置,type为属性类型
方法返回值:选中方法,添加参数,又上角点击参数,在右下角将direction选择为return,type改为返回类型
4、属性和方法的显示与隐藏
二、接口(Interface)
1、接口形状
1)选择接口,右下角的Styles
2)点击Format下面的下拉框,进行选择
C该处选择的是Lable
2、接口属性、方法
三、关联(Association)
举例:丈夫和妻子的关系
四、依赖(Dependency)
举例:动物和水的关系
五、聚合(Aggregation)
举例:学校包含很多建筑,但是学校垮掉后建筑还在
一对多的关系
六、组合(Composition)
举例:学校里面有很多课程,学校没了课程也没了
七、继承(Generalization)
举例:男人和女人继承了人的特征、
八、接口实现(Interface Realization)
举例:http与TCP都是网络接口实现的一种方式
九、接口类的依赖与实现
类图实践(IBM ROSE)
抽象类的表示
选中需要设置的类,勾选Properties->General->IsAbstract进行设置,设置完成后,类名会变成斜体
接口的表示
在Properties->General中将Stereotype设置为interface
新增类的属性
选中需要新增属性的类,点击Properties->General->Attributes的右侧按钮
弹出Collection Editor窗口,在选项为Attributes界面,点击Insert新增属性
选中新增的那一条属性,现在右侧的Properties菜单变成了属性的Properties菜单,在Properties->General中,通过Name和Type分别设置属性的名称和类型
static属性表示
在类图中,如果属性带下划线,表示这是一个static的属性,设置Properties->OwnerScope为CLASSFIFIER即可表示static属性
新增类的方法
和属性设置类似,选中需要新增方法的类,点击Properties->General->Operations的右侧按钮,弹出Collection Editor窗口,在选项为Operations的界面,点击Insert新增方法
设置方法的返回值
设置方法的返回值同样通过Operations界面进行设置,点击Properties->General->Operations的右侧按钮
弹出Operations窗口后,选中需要设置返回值的方法,现在右侧的Properties菜单变成了方法的Properties菜单,再次点击Properties->Parameters的右侧按钮
弹出Parameters窗口,点击在Parameters窗口中点击Insert新增一条Parameter
在Properties->General->Type中设置该Parameter的类型,Properties->General->Detail中设置DirectionKind为RETURN,表示该参数为返回值
完整的设置过程如下图:
设置方法的参数
设置方法的参数的过程基本和设置方法返回值的步骤一致,唯一不同的是:在Properties->General->Name中设置参数的名字,在Properties->General->Type中设置参数的类型,Properties->General->Detail中设置DirectionKind为IN,表示该参数为方法传入的参数
内部类的表示
设置内部类可以分为2步:第一步,将内部类拖到它所属的类里面
完成拖动的效果如下图,我们切换到Model Explorer中,可以看到整个类图之间的关系
第二步,在Model Explorer中,将CallBack拖到到KeyEvent中,从类图关系上表示CallBack是KeyEvent的类图内
完整的设置过程如下图:
导出类图为Java代码
我们在画完一个类图后,还可以将其导出为Java代码。选择需要设置的类图,然后右键会弹出设置窗口,选择Java->Generate Code
选择Generate Code后可能会报错:Java Profile has not been include.
可以在Model->Profile菜单中,将Java Profile添加进去
导入Java Profile,尝试重新生成Java代码成功
最后,查看导出的Java代码
自定义颜色
我们还可以自定义类图的颜色,选择需要设置的类图,然后右键会弹出设置窗口,选择Format->Fill Color就可以设置颜色
实验实训
某企业计划开发一套针对大学食堂的网上自动订餐、派送、支付等功能的电子商务系统。具体包括(但不限于)
1、任何人均可实名注册并登录系统;
2、当日菜品浏览和订餐;
3、可实时浏览订单状态。如果尚未配送,可撤销菜单;
4、授权人员进行配送并更新状态;
5、支付方式可以是货到付款,可以是从订餐者个人校园卡中扣除(如果余额不足则支付和订餐失败),也可以是其他方式;
6、正常结束和异常结束;
7、系统可实现整体的查询和统计分析功能。
请根据上述需求设计系统类图。