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

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

最新文章

  1. 使用File类列出指定位置的文件信息,包含该路径子目录下的文件信息
  2. 【67测试20161116】【数论】【DP】【思维】
  3. js中ascii码的转换
  4. FZU 1914 Funny Positive Sequence
  5. Raphaël 是一个小型的 JavaScript 库,用来简化在页面上显示向量图的工作。你可以用它在页面上绘制各种图表、并进行图片的剪切、旋转等操作。
  6. Facebook存储技术方案:找出“暖性BLOB”数据
  7. zoj 3725
  8. poj 1084 舞蹈链(纠结题)
  9. HTML5+移动APP(2)
  10. NSNotification消息
  11. NHibernate 的 ID 标识选择器
  12. Hope
  13. openwrt路由器更换了Flash之后需要修改的源码
  14. AdaBoost的java实现
  15. Tcl与Design Compiler (七)——环境、设计规则和面积约束
  16. 简约的HTML5音乐播放器插件
  17. tomcat部署项目的一点心得
  18. Maven启动Java Web工程,8081和8086端口号被占用
  19. MT【267】第一次很重要
  20. PCA降维实验代码

热门文章

  1. 【Java EE 学习 69 下】【数据采集系统第一天】【实体类分析和Base类书写】
  2. 剑指Offer-【面试题02:实现Singleton 模式——七种实现方式】
  3. Xcode显示出错
  4. VS2012 还原默认设置
  5. sping注解
  6. TAQSkinScrollBar 类美化滚动条再讨论
  7. VIew-CoordinatorLayout 笔记
  8. Fancybox丰富的弹出层效果
  9. BZOJ1129 : [POI2008]Per
  10. mysql_connect() php7不支持,php5.5可以,是废弃函数