采用b站动力节点视频学习:
【动力节点】UML与Rational Rose
视频:
什么是UML
Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于 1997 年一个 OMG 标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。面向对象的分析与设计(OOA&D,OOAD)方法的发展在 80 年代末至 90 年代中出现了一个高潮,UML 是这个高潮的产物。它不仅统一了 Booch、Rumbaugh 和 Jacobson 的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。
软件开发的时候,系统设计师/系统架构师给出 UML 设计图,程序员将来要根据 UML 设计图进行编码/开发。
需求图?
能够实现 UML 图的建模工具有哪些?
IBM Rational Rose
StarUML
MS Visio(比较在行的是流程图)
。。。。。。
常见的 UML
-
类图(Class Diagram):描述类的信息(包括属性、方法),以及类和类之间的关系信息。
-
用例图(Use Case Diagram):站在系统用户(系统角色)的角度分析系统存在哪些功能。
-
时序图(Sequence Diagram):描述程序的执行过程,方法的调用过程,方法的返回值等信息。(程序是一步一步怎么执行的,怎么调用的。)
-
状态图….
-
活动图….
UML图之类图
什么是类图?
描述类的信息,以及类和类之间的关系信息。
打开IBM,canel
保存你会发现
他的文件的后缀是.md,即models类型
命名crm,保存
画一个类图
通常在Rational Rose
工具的Logical View
目录下实现类图,一般会创建一些目录用来组织这些类图,因为类可能会比较多。
右键——new——package——rename(类图)
类图——右键——new——class Diagram(类图)
这就是画图的
先来一个市场活动 的一个类图
双击就打开了一个画布
根据需求去设计:
点击右边的class,选中类——取名Activity
双击打开,属性和方法等
点到attributes——属性
把上面的属性加上
以id为例子:
这里是private
如果换成public会咋样?
会变成锁定状态:
不能更改数据
然后改回private
继续添加
也可以这样直接在下面enter,写
添加如下:
根据这个图会写代码
打开这个画布窗口就点击一下画布——市场活动就行了
UML图之泛化关系
类和类之间的关系包括 6 种情况:
先总结一下:
- 泛化关系:(is a:Cat is an Animal——》继承)
- 实现关系:(like a: Cooker like a FoodMenu)
- 关联关系:(has a: Programmer has a Comper)
- 聚合关系
- 组合关系
- 依赖关系
泛化关系
泛化关系(is a:Cat is a Animal→继承):类和类、接口和接口的继承。
打开Rational Rose,建立Cat类图和Animal类图
然后Cat类继承Animal类,所以空心箭头→指向Animal
选择左边工具栏——generalization
可以把代码写下:
选择左边——note
Cat继承Animal
选择左边项目锚注——association class
可以选中crtl+c粘贴到word中
UML图之实现关系
实现关系(like a:Cooker like a FoodMenu):类和接口的实现
定义一个接口FoodMenu
选择左边——interface
右键——Options——stereotype display——label
以label形式显示
定义个Cooker类
然后Cooker实现FoodMenu
左边——realize
代码实现——implements(实现)
选择左边项目锚注——association class
链接代码
UML图之关联关系
关联关系(has a:Programmer has a Computer)
定义一个程序员类Programmer 和一个电脑类 Computer
有一个方式描述,有联系
使用左边——undirectional association(不定向联系)
双击箭头打开——例子:
描述之间数量关系:
一个程序员·
一个电脑
还可以描述角色:
电脑——coder
箭头的方向不能乱变的
上面是通过程序员可以找到电脑的
实线箭头表示:通过Programmer可以找到Computer,
Programmer对象当中有一个Computer的属性。
public class Programmer{
Computer coder;
}
public class Computer{
}
Programmer里面的定义的电脑必须是它的名字——coder
因为你前面定义过了
自关联
定义个人类Person类,《人类》
然后属性加一个名字name
然后选择undirectional association(不定向联系)
关联
自己
描述角色和定义数量
然后代码note
双向
定义人类类Human
属性定义好:名字和性别
先搞一个指向自己的单箭头
角色添加指向wife
但是你通过妻子也能找到你才对
所以应该是双向的
在Human上定义角色husband
如果要使用双向的话,把选项上的Navigable取消掉
补充上代码 定义类和属性
UML图之聚合关系
聚合关系描述的是整体和部分的关系,聚合关系是比较特殊的关联关系
比如:一个教室当中有多个学生,教室和学生之间的关系就是整体和部分的关系;
在聚合关系中,整体的生命周期不会决定部分的生命周期,例如:教室没了,学生还在,或者说学生走了,教室还在
例子:
定义一个ClassRoom类图和Student类图
然后关联undirectional association(不定向联系)
双击箭头改成聚合
先取消Navigable
在ClassRoom大的界面上勾选aggregate(集合的意思)
定义数量1对多
1个教师多个学生
定义1——0…n
这里还定义了角色students
最后把代码贴上:
UML图之组合关系
组合关系可以看做是一种特殊的聚合关系,整体的生命周期决定部分的生命周期,部分是依附在整体上面的,部分离开了整体是无法“存活的”。
例如:人和四肢的关系。
部分依赖整体,整体决定部分
例子:
先定义人Person类图和肢体类
然后关联undirectional association(不定向联系)
定义数量关系
1个人可能有四个到0个肢体,残疾人。。。。。
1对 0…4
先取消Navigable
整体是人,所以人那里的aggregate选中
然后再选中by value
表示组合关系
定义个角色
写代码:
UML图之依赖关系
依赖关系是所有关系中最弱的一种,这种关系通常体现在类和局部变量之间的关系。
例子:
定义一个类test和市场活动clue
这是泛化
定义的Clue是在方法里面的
如果挪出来
这是关联关系 has a
但是如果是在方法里面的,所以是依赖的,比较弱
用例图 use case diagram
什么是用例图 ?
站在系统用户(系统角色的角度分析系统存在哪些功能?
实现用例图的时候,需要先进行系统角色的抽取。
在 Rational Rose
工具当中一般会在 Use Case View
当中实现用例图。
怎么实现用例图?
定义角色
先新建一个包:package 命名:系统角色
再new——actor
用例图
新建个package 用例图
再新建一个package 部门管理
下面new——use case Diagram
画布
打开
把上面定义的管理员的角色拖过来
拖入用例 左边——useCase
定义这几个用例:
点击左边 关联undirectional association(不定向联系)
联系起来
这就是用例图
!UML图之时序图
最重要的!!!!! 写代码用
什么是时序图
时序图当中描述了方法的调用过程,程序的执行流程,以及方法执行结束的返回值情况。
怎么实现时序图呢?
时序图通常会在 Rational Rose
的 Logical View
中实现。
用例图当中的一个用例
会对应时序图当中的一个时序图
。
时序图描述的是一个功能具体是怎么实现的,流程是什么?
建包这样
新建一个画布 命名查看部门列表
建立存放系统类的包
要实现的是查看部门列表的时序图
那就是系统管理员实现
拖入
按照咱们设置的顺序
先是控制器,点击它的画布
定义类
然后拖进去
调用控制器的
使用左边——object mssage
调用的是里面的service方法
点击它右键new出来
这样控制器里面就有了
定义参数,返回void
会发送请求 代码
service点击调用自己
在调用
new出来dolist
属性一样的
控制器调用service
转到业务层service:
定义接口
拖进去
关联起来,定义方法getall
方法new出来
设置属性
Dept是部门,所以要转到领域模型创建
部门类Dept
回到主界面
会调用dao
在dao中定义接口
拖进去
然后
new 出来
dao里面
转到主界面
object用例
定义DB
关联
返回数据
在控制器这里自调用
转换格式
总结:
小人:动作的发起人
矩形/小圆圈:对象
实线箭头:调用
虚线箭头:返回
柱状:对象的生命周期,柱状不能断,在同一个流程当中不能断。
回折线:当前类的方法执行过程中调用自己当前类中的其它方法。
举个例子:
public class A{}
public class B{
public void m1(){}
}
这时候调用B中的m1
public class A{}
public class B{
public void m1(){
C c = new C();
c.m2();
}
}
public class A{}
public class B{
public void m1(){
C c = new C();
c.m2();
}
public void m4(){
......
}
}
然后自己调用了
public class A{}
public class B{
public void m1(){
C c = new C();
c.m2();
m4();
}
public void m4(){
}
}
然后到c
public class A{
public void XXXX(){
B b = new B(); b.m1();
}
}
public class B{
public void m1(){
C c = new C(); c.m2();
m4();
}
public void m4(){
......
}
}
public class C{
public void m2(){
m3();
}
public void m3(){
....
}
}