OOAD利器之UML基础
UML:Unified Modeling Language,即统一建模语言,简单地说就是一种有特殊用处的语言。本文是我初步学习UML的学习笔记,对于我们菜鸟码农来说,让我们做设计的可能性不大,但至少能看懂是必要的。
一、所谓模型
1.1 模型是对现实的简化
模型是提供系统的蓝图,模型可是包括详细计划。也可是是从更高程度考虑系统的总体计划,每个系统可以从不同的方面用不通过的模型来描述。因而每个模型都是在语义上闭合的抽象系统。模型可以是结构性的,强调系统的组织。也可是是行为性的,强调系统的动态方面。

1.2 为什么要建模?
有人云:建模是为了能够更好地理解正在开发的系统!
通过建模可以达到如下目的:
1、模型有助于按照实际情况或按照所需的样式对系统进行可视化;
2、模型能够规约系统的结构或行为;
3、模型给出了构造系统的模板;
4、模型对做出的决策进行文档化;
PS:对于一个复杂的系统,如银行、电信系统建模的重要性就越大。如果不能很好的理解一个复杂系统,盲目开发,失败的可能性很大。
二、小谈UML
2.1 神马是UML?
统一建模语言(Unified Modeling Language , UML) 是一种绘制软件蓝图的标准语言,可以用UML对软件密集的制品进行可视化、详述、构造和文档化。
2.2 UML的优点
1、可视化:清晰的模型有利于交流
2、详述:可以使用UML对分析、设计、实现等决策进行详细描述
3、构造:把UML描述映射成编程语言
4、文档化:系统的所有细节都可以是UML进行描述。如:项目计划、发布活动等
2.3 应用领域
1、企业信息系统
2、银行与金融服务
3、电信
4、国防、航天
5、科学
6、基于Web的分布式服务
三、类图—分析业务模型
3.1 类
类是一组具有相同属性、操作、关系和语义的对象描述,一个类可是实现一个或者多个接口。下图是类在VS里面的图形表示:

(1)UML预设了四种可见性,分别为公开(public)、私有(private)、保护(protected)、包(package) 减号(-)为私有可见性,加号(+)为公开可见性。可见,上图中的类图所有都为public。
(2)在UML中抽象类与普通是同一个是图表示,只是名字会变成斜体,如下图所示,调整IsAbstract属性为True后类名变为斜体:


3.2 关系
关系是事物之间的联系,在面向对象的建模中,有三种重要的关系是依赖、泛化、关联。
(1)依赖
依赖是一种使用关系,一个事物使用另一个事物。在图形上,把依赖画成一条有方向的虚线,指向被依赖的事物。如果被使用的类发生变化,那么另一个类的操作必然受影响。依赖关系在.net语言中体现为 局部变量、方法的参数或者对静态方法的调用,如工具类,现实生活中人与锤子。

(2)泛化
在泛化关系中,子类继承了父类的行为和含义,子类也可以增加新的行为和含义或覆盖父类中的行为和含义。在图形上,在泛化画成一个带有空心三角行指向父类。泛化在.net中就是一个继承的关系。

(3)关联
关联是一种结构关系,它指明一个对象与另一个对象间的关系。
①相互关联体现的是两个类、或者 类与接口之间语义级别的一种强依赖关系,是一种长期的稳定的关系;表现在代码层面,为被关联类以类属性的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量。

上图中ClassA与ClassB相互关联,在代码中各自有对方类型实例的一个属性。
②单向关联表现在代码层面,为被关联类B 以类属性的形式出现在关联类 A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

上图中Subject关联Observer,并且是一个一对多的关系,那么在代码中Subject类中会有一个Observer类对象的集合属性。
下面我们来看看几种特殊的关联关系,他们是:
③聚合关系:
聚合是关联关系的一种特例,他体现的是整体与部分拥有的关系。此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如汽车与发动机;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

④组合关系:
组合也是关联关系的一种特例,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。例如:孕妇死了胎儿自然也就死了(有点血腥的例子,抱歉!);表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

3.3 接口
接口(interface)如同契约,负责的类必须负责实现它的公开操作,以及负责维护它的公开属性。

3.4 综合案例:公司-部门-员工 类图关系

四、用例图—描述系统的行为
用例图用来表达系统对外提供的服务或功能,适合用来作为需求搜集阶段的工作。
4.1 用例与执行者
实际设计中,常用用例(UseCase)来表达系统需求或者系统对外呈现的行为。用例采用椭圆图示,参与者(Actor)是人型图示。由于它会参与系统的运作,因此它跟用例之间有连接线段。

4.2 包含关系
包含(include)关系指的是两个用例之间的关系,其中一个用例(称作基本用例,base use case)的行为包含了另一个用例(称作包含用例,include case)的行为。如下图,取款的 时候会包含一个用户验证的用例。

4.3 扩展关系
扩展(extend)关系将基本用例中一段相对独立并且可选的动作,用扩展(Extension)用例加 以封装,再让它从基用例中声明的扩展点(Extension Point)上进行扩展,从而使基用例行为更简练和目标更集中。如下图,我们在取完款后,可以打印凭条,也可以不用打印凭条。这个功能就可以使用扩展来表示。

五、活动图—流程分析利器之一
活动图通常用来表达业务流程、工作流或系统流程中一连串的动作。在我的实习前期,就经常用到活动图来绘制需求调研到的业务流程,并将活动图展示给客户以确认需求,客户也能看轻松地看懂。例如,下图是一个简单的登陆流程,登陆失败跳转到登陆页面,登陆成功则跳转到主界面。

PS:每个活动图只能有一个开始节点,但是可以有多个结束节点
(1)动作
动作(activity)是最重要的组成元素,它代表一个执行步骤。

(2)控制流
带箭头的连接线称为控制流(control flow)。当来源动作结束之后,控制流会启动目标动作。

(3)对象节点与对象流
对象节点(object node)为矩形图示,对象流(object flow)的图示与控制流相同,不过它的其中一个端点必须是对象节点,而另一端必须是其他节点。控制流的两个端点不可以都是对象节点。对象流不同于控制流,对象流可以携带数据或对象。

上图所示,在登陆成功后,我们将用户的Session对象传递到下一个节点,下一个节点可以使用此对象。
(4)决策与合并
活动流程中,流程交汇点,称为合并节点(merge node)。一个合并节点会有多条进入线,但是只有一条离开线,合并节点的图示是大的空心菱形,所有进入合并节点的支流都会经历同一条离开线。

决策节点(decision node)与合并节点共用图示,两者都是大的空心菱形。不过,决策节点只有一个进入线,但有多条离开线。

(5)分叉和连接
分叉表示的是一个控制流被两个或多个控制流代替,经过分叉后,这些控制流是并发进行的。
连接正好与分叉相反,表示两个或多个控制流被一个控制流代替。使用分叉需要使用连接把分叉的流汇聚成一个流。

(6)发送信号和接受事件
发送信号操作是一种操作,可以将消息或信号发送给另一个活动。
接受事件操作是一种要在等到消息或信号后才能继续执行的操作。

如上图所示,创建发票是一个发送信号,将发票这个消息发给另一个活动:收款。而收款是一个接受事件,它必须等到开完发票才能继续执行后续操作。
六、时序图—流程分析利器之二
时序图,又称序列图,用来表达系统内部一群对象的交互情况,它是一种行为图。水平方向是对象维,垂直方向是时间维。例如:page与action之间的交互情况可以用时序图来表示,在发送list请求的时候我们需要一个返回结果集。

(1)生命线
生命线(lifeline)代表一个参与交互的实例,它的图示是顶端连接矩形的虚线,虚线顶部的矩形可以放置生命线的名称。

(2)执行发生
对象在接收到消息之后执行一项活动,执行期间称为执行发生(execution occurrence),它的图示是长条矩形。

(3)消息
消息(message)的图示是一条带箭头的线段,横跨在两个生命线上,对象之间通过发送消息来交互。

(4)终止
生命线有生有灭,终止(stop)就是用来表达生命线终止的时刻。终止的图示是一个大叉,放置在生命线的虚线底部,代表生命线已经终止。

参考资料
(1)张传波,《火球——UML大战需求分析》,http://www.amazon.cn/tushu/dp/B0079FMI40
(2)周猛,《UML统一建模语言基础》,http://wenku.baidu.com/view/28fe7f65ad02de80d4d840ec.html
OOAD利器之UML基础的更多相关文章
- Java高并发编程基础三大利器之CountDownLatch
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- 后台任务利器之Hangfire
后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4 ...
- .NET Core开源组件:后台任务利器之Hangfire 转载 https://www.cnblogs.com/chenug/p/6655636.html
.NET Core开源组件:后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的D ...
- Win下必备利器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
- UML基础与Rose建模实训教程
目 录 第1章 初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章 Rational Rose工具... 6 2.1 安装与配置Rational Ro ...
- C#编程利器之二:结构与枚举(Structure and enumeration)【转】
C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...
- UML基础概念(转)
UML基础概念 UML概述 uml简介 uml(unified Modeling Language )为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的 ...
- php调试利器之phpdbg
信海龙的博客 php调试利器之phpdbg 简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的 ...
随机推荐
- 解决select2在bootstrap的modal中默认不显示的问题
在Bootstrap中的Modal,select2插件会有不显示,因为其z-index小于modal,还有另外一个问题是,修正z-index之后,select2不会自动失去焦点的问题.代码解决如下: ...
- 如何把Qlik Sense嵌入到Web应用中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这是一个给初学者(尤其对VS不熟悉的BI工程师)的入门操作向导. Qlik Sense是 ...
- vuex
英文:(Introduction)中文:https://github.com/vuejs/vuex/issues/176(贡献者努力中)
- asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)
// 注意:首先要在项目bin目录中添加引用 System.Management using System;using System.Collections.Generic;using System. ...
- 毕业论文—使用js将canvas保存为图片文件,并且自定义文件名
该文章引用http://blog.csdn.net/qq547276542/article/details/51906741 1.从canvas中直接提取图片元数据 // 图片导出为 png 格式 v ...
- (转)Lock和synchronized比较详解
今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不 ...
- selenium使用笔记(一)
有时候在交流群里经常会看到这样的问题,selenium能进行性能测试吗?selenium1和selenium2有什么区别等等问题,在这里谈一下自己学习和工作以后对selenium的认识.我所记录的东西 ...
- c:out标签和el表达式与跨域攻击XSS
很多时候,在JSP中我们喜欢用EL表达式输出信息,但是最近发现这个确实存在个问题:XSS即跨域攻击. 下面看个例子: <c:out value="${student.name}&quo ...
- LINQ 左右连接
LINQ 左右连接:DefaultIfEmpty() incomeList = (from p in db.Incomes join m in db.Items on p.ItemID equals ...
- JQUERY UI Datepicker Demo
datepicker_demo.htm <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &quo ...