![Android开发三剑客:UML、模式与测试](https://wfqqreader-1252317822.image.myqcloud.com/cover/831/844831/b_844831.jpg)
第2章 UML与StarUML简介
2.1 UML介绍
1.UML的定义
UML全称为Unified Modeling Language,中文翻译为“统一建模语言”,其主要内容是针对面向对象的分析和设计。UML是由OMG(Obeject Management Group)在1997年发表的图标式软件设计语言。
UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。UML适用于以面向对象技术来描述任何类型的系统,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。
UML具有以下重要的功能:可视化(Visualizing)功能、说明(Specifying)功能、建造和建立文档(Documenting)的功能。
2.UML的组成
UML由图和元模型组成,图是语法,元模型是语义。UML主要包括三个基本构造块:事物(Things)、关系(Relationships)和图(Diagrams)。
1)事物
事物是实体抽象化的最终结果,是模型中的基本成员,UML中包含结构事物、行为事物、分组事物和注释事物。
(1)结构事物(Structural Things)。
结构事物是模型中的静态部分,用来呈现概念或实体的表现元素,是软件建模中最常见的元素,共有以下7种:
● 类(Class):类是指具有相同属性、方法、关系和语义的对象的集合。
● 接口(Interface):接口是指类或组件所提供的服务(操作),描述了类或组件对外可见的动作。
● 协作(Collaboration):协作描述合作完成某个特定任务的一组类及其关联的集合,用于对使用情形的实现建模。
● 用例(Use Case):用例定义了执行者(在系统外部和系统交互的人)和被考虑的系统之间的交互来实现的一个业务目标。
● 活动类(Active Class):活动类的对象有一个或多个进程或线程。活动类和类很相像,只是它的对象所代表的元素的行为和其他的元素是同时存在的。
● 组件(Component):组件是物理的、可替换的部分,包含接口的集合,如COM+、Java BEANS等。
● 结点(Node):结点是系统在运行时存在的物理元素,代表一个可计算的资源,通常占用一些内存和具有处理能力。
(2)行为事物(Behavioral Things)。
行为事物指的是UML模型中的动态部分,代表语句里的“动词”,表示模型里随着时空不断变化的部分,包含两类:
● 交互(Ineraction):交互是由一组对象之间在特定上、下文中,为达到特定的目的而进行的一系列消息交换而组成的动作。
● 状态机(State Machine):状态机由一系列对象的状态组成。
(3)分组事物(Grouping Things)。
可以把分组事物看成是一个“盒子”,模型可以在其中被分解。目前只有一种分组事物,即包(Package)。结构事物、动作事物甚至分组事物都有可能放在一个包中。包纯粹是概念上的,只存在于开发阶段,而组件在运行时存在。
(4)注释事物(Annotational Things)。
注释事物是UML模型的解释部分。
2)关系
关系是将事物联系在一起的方式,UML中定义了四种关系:
● 依赖(Dependencies):两个事物之间的语义关系,其中一个事物发生变化会影响另一个事物的语义。
● 关联(Association):一种描述一组对象之间连接的结构关系,如聚合关系(描述了整体和部分间的结构关系)。
● 泛化(Generalization):一种一般化—特殊化的关系。
● 实现(Realization):类之间的语义关系,其中的一个类指定了由另一个类保证执行的契约。
3)图
图(Diagram)是事物集合的分类,UML中包含多种图:
● 类图(Class Diagram):类图描述系统所包含的类、类的内部结构及类之间的关系。
● 对象图(Object Diagram):对象图是类图的一个具体实例。
● 组件图(Compoment Diagram,也称构件图):组件图描述代码部件的物理结构以及各部件之间的依赖关系。
● 部署图(Deployment Diagram):部署图定义系统中软/硬件的物理体系结构。
● 用例图(Usecase Diagram):用例图从用户的角度出发描述系统的功能、需求,展示系统外部的各类角色与系统内部的各种用例之间的关系。
● 时序图(Sequence Diagram):时序图表示对象之间动态合作的关系。
● 协作图(Collaboration Diagram):协作图描述对象之间的协作关系。
● 状态图(Statechart Diagram):状态图描述一类对象的所有可能的状态及事件发生时状态的转移条件。
● 活动图(Activity Diagram):活动图描述系统中各种活动的执行顺序。
上述9种图可归纳为五类,如下表所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0047_0001.jpg?sign=1738850875-Zk1v6K6MfVmHPkjFFOVRw3ZOsgDx59RE-0-304871dfbfd5d5678e966fa308379f98)
2.2 安装StarUML
StarUML是一款开源、免费的UML开发工具。
使用StarUML可以创建UML用例图、类图、时序图、状态图、活动图、通信图、模块图、部署图及复合结构图等。
现在很多公司均使用轻量级的UML开发工具,StarUML受到越来越多人的青睐。同时,StarUML也是很多初学者学习统一建模语言的首选。
进入StarUML的官方网站(http://staruml.sourceforge.net/en/index.php),如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1738850875-tNjuU16RYDfk7yGJTcHCHUjBPvdHf4TJ-0-94025884744d7fa2962395a202f4a6e4)
下面来说明整个安装过程。
(1)可以到http://staruml.sourceforge.net/en/download.php下载安装包。
(2)安装。笔者把StarUML安装在了D:\UMLSpace\StarUML\ProgramFiles目录下。
(3)安装后启动StarUML,出现如下图所示的界面。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0048_0002.jpg?sign=1738850875-8VWqOwbPAL2QKfKvDJ9E2lgo0hznJYQP-0-a6986f284a6b343453ef86da62e7b778)
单击“OK”按钮即可,此时StarUML已经成功启动,下图是StarUML启动后的界面。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0049_0001.jpg?sign=1738850875-1CtuW41VrQMNYWbWMEgsvp8isqiuYZqm-0-9eb16ad153289062e02f9035062c997c)
2.3 StarUML入门
下面让我们一步一步地探索如何使用StartUML进行统一建模。事先说明:这里只是探索了如何使用StarUML进行统一建模,主要包括类图、对象图、类图和对象图的相互关系(这种关系主要是类、接口等的关系)。
启动StarUML初始工作界面,如下图所示。主要包括四个部分:左边的工具栏、中间的工作区、右上边的浏览区和右下边的属性区。图中的“工具栏”、“工作区”、“浏览区”、“属性区”是为了读者更好地浏览而加上去的,不属于StarUML本身。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0050_0001.jpg?sign=1738850875-xXL1Jg84SVANVq3iEaksl22CpbB0Yng2-0-d35cf6bb7477346652ac2157d8505cd5)
1.UML类图
UML类图包括类名、属性、方法三部分。
(1)选中工具栏中工具箱中的“Class”,在工作区中只需用鼠标轻轻一点就可以出现一个简单类的初始模型,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0050_0002.jpg?sign=1738850875-wUazTqarzeWlNELoGWtl2jJajTNb62EM-0-e5e16cc270d5db360367dec31856d0bb)
(2)将这个类做成真正想要的类。
首先是改变类名:双击上图中的“Kim, Hyunsoo”,然后输入想要的名字,在这里输入“Person”。
其次是添加属性:双击“Person”,此时在“Person”的右面出现一个框,点选右边框中左侧的“Add Attribute”即可添加一个属性,此时把这个属性重命名为“name”,然后再添加一个属性“age”。接下来可以给属性设定类型,选择相应的属性,会发现Type的类型很少,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0051_0001.jpg?sign=1738850875-iwSNvjUvOwEdSJFt9myvD6wJR8CYsnUR-0-e8c064b9ce17717970fae92ea9b8bd6e)
解决方案:使用快捷键Ctrl+F8或者单击菜单栏的“Model”,在弹出的下拉列表框中单击“Profiles”,弹出如下图所示的对话框。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1738850875-qXKUxyxKsY6RupKdlQUWe900Ho5r0PnI-0-1a9ef519ca57c96b9f5c91b5c7319cde)
单击“Java Profiles”,然后单击中间的“Include”即可,此时在打开Type选择框时就会有很多类型了,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0051_0003.jpg?sign=1738850875-UDWjv9emYmIMe3fAd09D1rG4iAfr5o8p-0-bae9ae9907c5d726707f6305357a1a49)
选择相应的类型,这里设置name为String类型,age为Integer类型。
接下来是分别添加每个属性的Getter和Setter,最终的类图如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0052_0001.jpg?sign=1738850875-DK3bTKPgZKvxBOE2OsHBKdP7yVw5HQbu-0-b53ef61a28ff45e76a08ecf250510c69)
2.抽象类
这里以抽象的Animal为例进行说明,该抽象类有一个抽象方法:sleep。
和建立类图类似,只是在类图的属性中要选择“IsAbstact”属性按钮,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1738850875-kFSOu2GtYXUvMgfuaXUl4Ys3ZkBXdX4l-0-6017d460ddd5b39a3f6d59ec6c8b2f8e)
方法变为抽象的方式:同样是在方法的属性上勾选“IsAbstract”,最终效果如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0052_0003.jpg?sign=1738850875-J5JoXWfciCok3fzfD5biMVnC56x9f41m-0-4f31c6418340fdbfa10f6b70a1696fa4)
3.接口
接口的默认形状是一个棒棒糖,接口中的所有方法都是公开抽象的。
注意在StarUML中接口在工具栏中要点选的是“Interface”,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0052_0004.jpg?sign=1738850875-aS5J3Vz1IufKOytjhtlFftaj5kvkBIVG-0-6cbb4b5d2619d47b94d948e8d298d273)
例如,有一个Car接口,该接口有一个run方法,结构图如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1738850875-b5Qr06tyBa1vupqKVlHkmAcbmIsqf0fB-0-18db0860e102614bc51560a1ece63c7f)
4.对象图
下面一起来看一下对象图,面向对象编程思想中有一句很重要的话叫做“一切皆对象”。
做一个对象图基本分以下几步。
(1)建立一个Person类的实例,为了方便,这里的Person类是使用前面建立的Person类。
选中工具箱中的“Object”在工作区中单击一下,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1738850875-IZZcdhqGZONyRlLxoyrDoIWEKG0pW30k-0-8904a6d1e3256d0a852f157f5d7b2812)
把该对象命名为“zhangsan”,在属性中选择“Classfier”中“Design Model”下的“Person”即可确定其类型,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0053_0003.jpg?sign=1738850875-mewKw9P12JrQboNWGFrhADjF5TysRJYW-0-5773095dbb3d33a1679b92d9c97d03b6)
(2)为zhangsan这个Person实例化对象添加属性。
在对象上面单击右键,依次选择“Add”、“Attribute Link”添加相应的属性,把属性重命名为“name”, Attribute选择为Person中的name,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0054_0001.jpg?sign=1738850875-lSuyjLsyK3KuA9HFhhLxRPxW96KPoF8J-0-be4236b248be3a43626eaebbbeb3352e)
在属性框中设置Value为“张三”,如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0054_0002.jpg?sign=1738850875-g7rNzhC4Z41TZdTnDYGQsw00eAfa1TDi-0-990870eba7724286281fb4fb249ecb57)
这样一个name值就设定好了,设置好后的效果图如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0054_0003.jpg?sign=1738850875-KqP0OTQzd4Fr78dsbhmwVaKyj36m6aL4-0-d797a3bda6c7cd80db907d44833b0de1)
5.“一般化关系”,也就是面向对象中的“继承”
类图的建立和前面讲到的没什么两样,选择Animal类,然后让Dog和Cat都继承这个类,选择关系式要选择工具箱中的“Generalization”,这些都很简单,最终的效果如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0054_0004.jpg?sign=1738850875-qT8qMd7QceZyHGXz2H0qKJhvdyrsqcLh-0-8a8e0164b497008f72c01660f29529fb)
想必到目前为止,读者基本可以熟练地使用StarUML进行UML建模了,IT界有一个非常著名的原则叫“最小惊讶原则”,现在如日中天的Ruby把这一原则发挥得淋漓尽致。
6.Realization:实现接口
效果如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0055_0001.jpg?sign=1738850875-ya3Pt1uuV8zzhoE28DrMfl45IUXiwBOV-0-4d0b0587a6753d6ddb694312fb093cb3)
关联关系:关联关系在形式上表明一个类拥有对另外一个类的引用,关联有单向关联、双向关联和自关联等。建立关系式使用的是工具箱中的“Association”。在关联模型中可以给关联关系起一个符合自解释功能的名字。同时可以设定关联基数,如一对一、多对一、一对多、多对多等。这里以Driver和Taxi为例来说明关联关系,效果如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0055_0002.jpg?sign=1738850875-f54N5qM6aoIYp2v8PQua5SW0TMkhZkpu-0-eeca5dcb38f62abf67fb2ec4f723866d)
聚合关系:聚合关系是关联关系的一种,但比关联关系更强烈,它表明了一种整体和部分之间的关系,在StarUML中做聚合关系时使用的是工具箱中“Aggregation”,聚合关系的UML示例图如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0055_0003.jpg?sign=1738850875-6HyReCwFM58kdeoiDwrMUl6i2xmd9UXR-0-e66db2f2adea54565e5386787a8ab8a4)
合成关系:合成关系也是关联关系的一种,是一种比聚合关系更强的关联关系。它要求作为整体的部分必须负责作为部分对象的生命周期。例如,说人具有一双手,人负责人的手的生命周期,手离开了人是没有意义的,离开人的手也就不再是手了。合成关系要使用工具箱中的“Composition”来构建。合成关系的UML示例图如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0055_0004.jpg?sign=1738850875-IN70OfTyDobiSuxzU2ZhhXKuxNkzLndp-0-4b614ff1297d7a93e43c81fbda371158)
依赖关系:依赖关系也是关联关系的一种,它是指一个类依赖于另外一个类的存在而存在。例如,人是依赖于房子的存在而存在的。在StarUML中依赖关系的UML建模需要使用工具箱中的“Dependency”,示例图如下图所示。
![](https://epubservercos.yuewen.com/FEE4CD/5809689104636001/epubprivate/OEBPS/Images/figure_0055_0005.jpg?sign=1738850875-buwXVhuLJwAflsWZ1hdoom5gXERf5WFo-0-3dc737c369d1cd096b4853051e2a3aae)