当前位置 博文首页 > 阿俊之家●●●https://ximenjianxue.blog.csdn.net:UML建模图

    阿俊之家●●●https://ximenjianxue.blog.csdn.net:UML建模图

    作者:[db:作者] 时间:2021-09-08 13:28

    一、背景

    UML:Unified Modeling Language(统一建模语言),是一种绘制软件蓝图的标准语言(是一种绘画语言,不是一种编程语言),为面向对象开发系统的产品进行说明、可视化、和编制逻辑文档。我们在面向对象的软件开发项目中,在程序规划、设计阶段,通过过使用 UML 的面向对象图的方式来更明确、清晰的表达项目中的架设思想、项目结构、执行顺序等一些逻辑思维 ,以帮助我们完成应用规划,设计,开发,UML 作为一种模型语言,它使开发人员早期更专注于建立产品的模型和结构,而不是选用什么程序语言和算法实现。UML 统一了Booch(早期面向对象的软件开发方法)、OMT(对象建模技术/方法)、OOSE(面向对象的软件工程)和其他面向对象方法所涉及的基本概念和建模符号。下面,让我们一起看下如何使用UML来建模实践。

    UML 的目标:用 UML 作为软件工程中的建模机制,帮助我们按照实际情况或者按照我们需要的样式在项目早期对系统进行可视化,便于开发、用户尽可能清楚了解项目的建设需求,明确建设目标,挖掘真实需求和保证有效沟通;UML提供了一种详细说明系统的结构或行为的方法;给出一个指导系统构造的模板;客对我们所做出的决策进行文档化规范。

    UML图是软件工程的重要组成部分,软件工程从宏观的角度保证了软件开发的各个过程的质量。而UML作为一种建模语言,更加有效的实现了软件工程的要求。

    在这里插入图片描述

    二、概述

    使用UML进行建模的作用有哪些:

    ●可以更好的理解问题
    ●可以及早的发现错误或者被遗漏的点
    ●可以更加方便的进行组员之间的沟通
    ●支持面向对象软件开发建模,可以更好的描述显示编程的情景。
    ●对于复杂的系统来说,如果概要模型做的好,那么整个系统的模型也就很清晰明了。

    UML模型主要有三部分构成:

    事物(Things):UML模型中最基本的构成元素,是具有代表性的成分的抽象,事物是实体抽象化的最终结果。
    关系(Relationships):关系把事物紧密联系在一起
    图(Diagrams ):图是事物和关系的可视化表示

    工具软件下载:StarUML,学习:相关资料。

    UML 规格定义了两大类UML图:结构图( structure diagrams )和行为图(behavior diagrams),UML 图是面向对象的概念的表示。下图为UML2.5官方图,从中我们看下UML图分类:
    在这里插入图片描述

    从另一个角度,UML图又可分为用例视图、设计视图、进程视图、实现视图和拓扑视图,又可以静动分为静态视图和动态视图。静态图分为:类图,对象图,包图,构件图,部署图。动态图分为:用例图,状态图,活动图,协作图,序列图。
    在这里插入图片描述
    在这里插入图片描述

    2.1、面向对象

    1)面向对象基本概念:

    对象: 对象代表一个实体的基本构建块.

    类: 类是对象的蓝图.

    抽象化: 抽象代表现实世界中实体的行为.

    封装: 封装是将数据绑定在一起,并隐藏他们外部世界的机制。

    继承: 继承是从现有的机制作出新的类。

    多态性: 定义的机制来以不同的形式存在.

    2)面向对象的分析与设计可以描述为:

    ●在面向对象的分析,最重要的目的是确定(识别)对象以适当的方式描述他们。如果这些对象可有效识别,那么接下来的设计工作是很容易的。对象应确定职责。职责是对象所执行的功能。每一个对象具有某种类型的要执行的责任。当这些责任协作可以完成最终企业/组织的目标,则系统的目的达成。

    ●第二阶段是面向对象的设计。在这个阶段的重点是满足关系要求及其职责履行情况,确定对象之间的关系,在这一阶段中的对象应根据其预期完成关联协作。

    ●第三阶段是面向对象的执行。在这个阶段,设计采用面向对象语言,如 Java,C++ 等,将类编译转换为可执行文件。

    2.2、UML 10种图

    1)用例图(UseCase Diagrams):

    它从用户的角度描述了系统的功能,并指出各个功能的执行者/使用者,强调用户的使用,系统为执行者完成哪些功能。主要回答了两个问题:1、是谁用软件。2、软件的功能。

    在软件生命周期的整个过程中,用例图是软件需求分析到软件交付的第一步,用例图的主要目的是说明这个软件的使用者是谁,使用者要使用那些功能,以及使用者需要向软件提供什么功能(外部集成,用户交互输入等)。通过用例视图一来可以让使用者清楚的理解这个软件到底能提供什么功能,是不是满足自己的需求,另外一方面对应开发者来说,可以更好地理解需求,从而能更好的去实现这些需求。
    在这里插入图片描述
    用例图主要有六个元素:参与者(Actor)、用例(Use Case)、关联关系(Association)、包含关系(Include)、扩展关系(Extend)以及泛化关系(Generalization)。
    在这里插入图片描述

    参与者(Actor):在uml中用下面带有名字的小人图形来标示,主要表示与您的软件系统交互的人,组织或者外部软件系统。
    在这里插入图片描述

    用例(Use Case):在uml中用使用椭圆标示,主要说明你的软件系统的功能,是使用文字描述的形式说明你的系统的功能。
    在这里插入图片描述

    关联关系(Association):在uml的用例图中用箭头来标示,主要描述参与者与用例之间的关系。
    在这里插入图片描述

    包含关系(Include):在uml中包含关系用虚线箭头+<名称>字样表示,有时候一个用例很大,那么我们可以把用例分块,把复杂的用例分解为几个小用例来描述;【箭头指向】:箭头指向被包含的用例,即指向分支。
    在这里插入图片描述

    扩展(Extend):在uml中扩展关系用虚线箭头+<>字样表示,扩展是指在基础用例功能的基础上插入新的功能点,新的功能点可以看做是对基础用例的扩展。【箭头指向】:箭头指向基础用例,即指向父项。
    在这里插入图片描述

    泛化(Inheritance):在uml中泛化用一个空心三角箭头从子用例指向父用例,泛化就是继承关系,子用例可以使用父亲用例中的属性,行为和关系。【箭头指向】:箭头指向父用例。

    Include、Extend、Inheritance总结对比

    包含关系强调整体与部分之间关系,也就是说整体的功能是由一个个子用例功能叠加起来的,比如上图庭审功能就包含了线上视频庭审,线上语音庭审,线下语音庭审功能,庭审用例本身是对子功能的汇总标示,具体功能点在子用例实现。

    扩展关系则强调是在基础功能的基础上添加新的功能,基础功能本身是提供功能的,基础功能和扩展功能直接是不可见的,但是扩展功能是要在基础功能的某一个条件下才会发生,例如上面基础服务视频庭审已经提供了庭审的功能,现在有加了了扩展的语音识别功能来识别用户说的话为文字。之所以说是扩展功能是因为即便没有语音识别功能,视频庭审功能还是照样可以正常运转,之所以说扩展功能是有条件发生是因为只有开通了语音识别的视频庭审才能回有语音识别的扩展功能

    泛化关系强调复用的关系,也就是说子用例基础了父用例的一部分功能并且自己有新增了或者覆盖了父用例的功能,具体说比如上图视频庭审有个记录笔录的功能,这个本身是个独立的功能点,而书记员和法官都可以复用这个功能并对其定制化。

    示例:
    在这里插入图片描述

    2)时序图(序列图sequence diagram):

    工具:ZenUML 。

    它是一种强调消息时序交互图(interaction diagram),他由对象(Object)、消息(Message)、生命线(Lifeline)和Combined Fragments组成,它主要描述系统中对象和对象之间的交互,它将这些交互建模成消息交换。

    序列图的主要用途是把用例表达的需求,转化为进一步、更加正式层次的精细表达。用例常常被细化为一个或者更多的序列图。同时序列图更有效地描述如何分配各个类的职责以及各类具有相应职责的原因。

    时序图将交互关系展示成了一个平面二维图,其中纵向标示时间轴,时间沿竖线从上向下进行。横向轴标示了交互中各各个对象。对象的的用生命线表示。消息从一个对象的生命线到另一个对象生命线的箭头表示,箭头以时间顺序在图中从上到下排列,从左到右排列。

    对象(Object)生命线(Lifeline):生命线头上那个方正的框里面存放的就是对象,对象有自己的名字,生命线其实就是从上到下一个虚线。生命线标示一个对象存在的生命周期,两条生命线中间通过消息连接起来:
    在这里插入图片描述
    消息(Message):用于对象间传递信息,对象之间的信息互通就是通过消息,消息按照分类可分为:同步消息(Synchronous Message),异步消息(Asynchronous Message)和返回消息(Return Message)、 自关联消息(Self-Message)。

    同步消息:发送消息的对象在发送消息后会挂起,等消息接受对象接受消息返回后才会解除挂起的状态继续自己的工作。

    异步消息:发送消息的对象在发送消息后会继续自己的工作,而不等消息接受对象接受消息返回。

    返回消息:标示发送消息后返回的动作;
    自关联消息:一个对象内自调用的情况。

    在这里插入图片描述
    另外,如上图示,时序图有控制焦点,控制焦点是一个瘦高的矩形,表示对象执行一个动作所经历的时间段,既可以是直接执行,也可以是通过下级过程执行。矩形顶部表示动作开始,矩形底部表示动作的结束。

    区别:通信图(communication diagram):它是一种强调收发消息的对象或角色的结构组织,强调参加交互的对象。在图形上,通信图是顶点和弧的集合。

    构造通信图的第一步就是将参加交互的对象作为图的顶点,然后,把连接这些对象的链表示为图的弧,链上可能有标识这些对象的角色名,最后,用对象发送和接受的消息来修饰这些链。

    Combined Fragments: 标示需有一定条件触发的消息发送。有:

    Alternative fragment(denoted “alt”) 标示 if…then…else
    Option fragment (denoted “opt”) 标示Switch
    Parallel fragment (denoted “par”) 标示同时发生
    Loop fragment(denoted “loop”) 标示for
    Break标示退出循环

    1> loop: 当没有指定循环边界默认范围为[0,无穷大]:
    在这里插入图片描述
    如果只指定了一个值,那么默认执行该值次数:
    在这里插入图片描述
    指定了循环边界,则最少执行最小值值,最多执行最大值次数:在这里插入图片描述
    实现do……while方式,至少执行一次,如果size<0则退出:
    在这里插入图片描述
    2>alt: 条件判断,如果n>0则执行agree函数,否者执行reject函数:
    在这里插入图片描述
    3>opt: switch,当满足不同条件执行不同方法:
    在这里插入图片描述
    4>break: n=10时候执行save并退出循环
    在这里插入图片描述
    5>par: 同时进行,比如多个线程同时执行任务
    在这里插入图片描述
    示例图1如下:
    在这里插入图片描述
    示例2图:
    在这里插入图片描述
    消息用从一个对象的生命线到另一个对象生命线的箭头表示。箭头以时间顺序在图中从上到下排列。

    3)类图

    类图是面向对象系统建模中重要的图,是定义其它图的基础。类图主要是用来展现软件系统中的类、接口以及它们之间的静态结构

    在uml类图中,类之间关系有如下: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)

    1> 泛化(Generalization):

    泛化是继承关系的一种,子类继承父类的所有行为和属性,子类可以新增新的功能或者重写父类功能。uml中使用带空心三角箭头实线标示。【箭头指向】:箭头指向父类
    在这里插入图片描述
    2> 实现(Realization):

    实现是接口和类的关系,是指类实现了接口中定义的接口,uml中用带空心三角箭头虚线来标示。【箭头指向】:箭头指向接口类
    在这里插入图片描述
    3>关联(Association)

    在建模过程中必然存在类之间联系,使类可以感知其他类的行为和属性,关联分为双向单向关联

    双向关联(标准):对于双向关联来说被关联的两个类可以感知对方的存在。
    在这里插入图片描述
    如上图所示,在线每端放置一个角色多重值,对于Route来说我们应该看在bike端的角色和多重值,对于Route来说每个骑行路线对应0个或者多个自行车,0个是因为可能先制定了骑行路线但是还没有找到自行车,多个是因为可以有多个人骑行同一个路线。对于bike来说我们应该看route端的角色和多重值,对于一个bike来说每个自行车对于0个或者多个骑行路线,0个是因为虽然有一个自行车但是我可以不骑行,不指定骑行路线那,多个是因为我一个自行车可以指定多个骑行路线。

    上面多重值为0…*,其实还有其他多重值如下表:
    在这里插入图片描述
    **单向关联:**对于一个单向关联来说也是两个类是相关的,但是只有一个类知道这种联系的存在。
    在这里插入图片描述
    如上图所示,对于单向关联表示为一条带有指向已知类的开放箭头实线,单向关联只包含一个角色名和多重值,一个人可以有0个或者多个账户,人可以感知到账户的存在,但是账户却感知不到人的存在。

    4>聚合(Aggregation)

    聚合是关联关系的一种,聚合主要描述整体与部分直接的关系,聚合有分为基本聚合组合聚合

    基本聚合:部分类的生命周期独立于 整体类 的生命周期,uml中使用一条从整体类到部分类的实线,并在整体类的关联末端画一个未填充棱形标示,比如:一个汽车有4个轮子组成,轮子的生命周期不依赖与车的,因为车轮可以独立于车独立存在。如下:
    在这里插入图片描述
    组合聚合: 不同在于部分类的生命周期依赖整体类,uml中使用一条从整体类到部分类的实线,并在整体类的关联末端画一个填充棱形标示;如:一个公司有至少一个部门组成,部门要依赖于公司的存在而存在,不会存在一个部门而它不属于某一个公司。图示如下:
    在这里插入图片描述
    自身关联:自身关联涉及到一个类,是类自己关联自己的情况。比如:一个雇员可以有0个或者多个管理者,而管理者本身也是雇员的一种。图示如下:
    在这里插入图片描述

    5>组合(Composition),

    组合是聚合的变体,它具有强拥有关系,而且整体与部分的生命周期是一致的。在组合式聚合中,一个对象在某一个时间内只能是一个组合的一部分。 相对于聚合而言,在聚合中一个部分可以由几个整体共享。
    在这里插入图片描述
    6>依赖(Dependency)

    依赖即一个类的实现需要其他类的协助,通常代码表现为方法参数,局部变量,静态方法调用,util类调用,uml中使用一条箭头虚线,从依赖方指向被依赖的类。
    在这里插入图片描述
    示例图1:
    在这里插入图片描述
    说明:

    先围绕类Library类分析下上面这个图,首先library通过组合方式关联到了Catalog目录类,这说明目录类不能独立存在要依赖图书馆存在,所以这里没有使用聚合而使用了组合。另外library通过聚合关联到了Book Item 类和Account账号类,这说明图书馆是有0个或者多个图书和账户组成,这里使用聚合而不是用组合是因为书和账号可以独立于图书馆存在,比如我有学号账号,但是图书馆里面不是必然有你的账号。

    下面围绕Catalog分析,类目通过双向关联关联到bookitem,说明一个类目里面可能会有0个或者多个书籍,一个书籍对应着一个类目。另外类目有通过realization实现了search类和manage类的接口,让类目有搜索和管理功能。Search类搜索时候会依赖Patron类图书捐赠人的姓名地址或者Libraian类图书管理员的姓名地址,职位。 图书管理类时候会依赖图书管理员类的信息。

    而Patron图书捐赠人有可能是一个学生,学生有自己的账号,所以patron类会聚合到Account;bookItem类通过泛化继承Book中书的共性部分信息。有通过关联关联到了account,说明一个账户只能接到0本和最多12本书,最多可以预定3本书。

    最后Book类双向关联到Author类,数目一个作者至少写了1本书(严格说应该是0),一本书至少有一个作者编写,Account账户类有依赖一个AccountState的枚举值的类用来存放账号状态。

    示例图2:
    在这里插入图片描述

    4)活动图(Activity Diagrams)

    活动图是UML中一种行为图,它展示了控制流对象流,并且强调它们的顺序和条件控制流。

    1> 活动图构成元素

    开始(inital):

    在这里插入图片描述
    结束状态(final):
    在这里插入图片描述

    活动(action):标示动作
    在这里插入图片描述
    控制流(control flow):链接活动,用带箭头的折现标识数据流流向;

    决策(decison):条件判断
    在这里插入图片描述
    合并(merge):任意一个节点到达该点都继续往下走,不管其他分支
    在这里插入图片描述
    游泳道(swimlanes):模型中存在多个对象时候使用比较适合;分为水平和垂直:
    在这里插入图片描述
    分岔汇合(join):所有分支都到该点时候才继续往下走,类似CountDownLatch.await后在继续往下走
    在这里插入图片描述
    分流(fork):类似fork多个线程执行放入线程池执行
    在这里插入图片描述
    接受信号(acceptsignal)
    在这里插入图片描述

    2> 图例

    示例1:下图为uml官方online shopping网上购物例子
    在这里插入图片描述
    说明:
    上图,左上角黑色圆活动开始,首先通过decision的条件判断是进行搜索还是浏览,如果是搜索则通过merge节点后搜索商品,然后通过decision节点判断搜到商品则进入在做决定是浏览商品信息还是加入购物车。加入购物车后可以选择进入B继续
    搜索其他商品,或者查看购物车内容,然后购物完后,进入C进行付款,然后流程结束。

    另外可以随时接受信号去查看,进入A查看购物车信息,也可以随时收到信号去checkout商品。

    示例2:uml官方Activation of Trial Product激活试用产品例子
    在这里插入图片描述
    说明:
    首先这个活动图里面由于模型涉及到了Order Management, Customer Service, Customer三个对象,所以使用了垂直的swimlanes。

    首先customer请求激活自己正在使用的试用期产品(估计试用期过了,不能使用了),然后顾客服务对象通过fork开启两个流程,一个流程是让Order Management创建产品订单,一个是让用户产生C2V文件。然后Customer Service在 join 处等待两者完成,这里都完成在拿着产品秘钥和C2v文件去激活产品,通过email等把文件传递给用户,用户拿到文件既可以激活,至此活动结束。

    5)组(构)件图(component diagram)

    组件图是为了表示组元(components),组元提供的接口(provided inerfaces)和需要调用的接口(required interfaces),端口(ports)之间关系的一种图,展现了一个封装的类和它的接口,端口以及内嵌的构件和连接件构成的内部结构,展示系统中构件与构件之间,类或接口与构件之间的关系。用于表示系统的静态设计实现视图。组件图是主要被用于基于组件开发时候用来描述SOA系统。构件之间的关系表现为依赖关系,定义的类或接口与类之间的关系表现为依赖关系或实现关系。

    附录:文献参考

    http://ifeve.com/uml-intro/
    https://www.cnblogs.com/jiangds/p/6596595.html
    w3cschool.cn/uml_tutorial/uml_tutorial-5y1i28pl.html

    未完待续……

    cs