收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


javasscc的笔记
状态: 离线
人气:505218
访问用户量:1137
笔记经验:
总积分:1958
级别:普通会员
搜索本笔记
ta的交流分类
ta的交流主题贴(196)
ta的所有交流贴(200)
ta的全部笔记
全部笔记(98)
未分类笔记(0)
研磨设计模式(94)
课程问题(0)
设计模式综合项目实战(4)
存档
2013-05(4)
2012-08(39)
2012-07(55)

2012-08-31 15:55:53
研磨设计模式 之 附录二 UML简介——跟着cc学设计系列
浏览(6164)|评论(0)   交流分类:Java|笔记分类: 研磨设计模式

27.1  UML基础

       由于本书用UML来表达模式的结构和基本的运行顺序示意,特此为不熟悉UML的朋友准备了一些相关UML的快速入门知识。

       这里只是UML知识的一小部分,如果需要了解更多的UML知识,请参阅UML的学习文档,UML的网站http://www.uml.org/是个好去处。

27.1.1  UML是什么

    UML是一种标准的图形化建模语言,它是面向对象分析与设计的一种标准表示。

    (1)UML是一种语言

从上面的定义可以看出,就其本质UML是一种语言,既然是语言,那就是用来交流的,UML用来在哪些人员之间进行交流呢?很明显,UML主要是在软件开发的整个生命周期所涉及到的人员之间进行交流的语言。

    (2)UML是一种建模语言

那么什么是建模呢?

    模型是用某种工具对事物的一种表达方式,通常会表达出事物最重要的方面而简化或忽略其它方面。比如常见的工程模型、飞机模型、车辆模型等等。

    模型在软件上主要的作用是:模型可以在一定的抽象层次上,使人们通过对模型的分析和研究,来制定出最终的软件的结构和内部的相互关系。

(3)UML是一种图形化建模语言

为什么要图形化呢?

很简单,图形化的东西直观、简单、准确,更有利于软件开发的整个生命周期所涉及到的人员之间进行交流,因为对于一个大型的软件项目,参与的人员很多,根本不可能相互用语言来交流,图形化是一个很好的方案。

(4)UML是一种标准的图形化建模语言

只有标准的东西,才会有更多的人学习和使用它,大家对同一表达的理解才会一样,才能真正达到相互交流的目的。

否则要是没有标准,大家各自为政,可能会出现同一个图形,大家有不同的认识和理解,那就没法子交流了。

27.1.2  UML历史

       UML出现在1995年,到1997年的时候,由OMG进行统一,并于同年由OMG全体成员通过采纳为标准,也就是UML1.1版。

       1998年,对UML1.1版进行了少量修改,推出了UML1.2版,随后几年,陆续的推出1.3、1.4、1.5等版本。

       直到2003年UML2.0被OMG接纳为标准,最新的UML2.0的可用版本于2005年7月发布。

27.1.3  UML能干什么

       UML主要用于对软件进行描述、可视化处理、构造和建立软件系统的文档,以方便对系统的理解、设计、浏览、配置、维护和信息控制,通过它,参与软件的各个生命周期的人员,可以很方便的交流。

27.1.4  UML有什么

简单的说:UML由视图构成,视图由图构成,图由图片组成,图片是模型元素的符号化。图是一个具体视图的组成部分,一种视图通常会包含多种图。

  • 所谓视图:描述完整系统中的一个抽象,用来显示这个系统中的一个特定的方面。
  • 所谓图:用来表示系统的一个特殊部分或某个方面。
  • 所谓模型元素:所有可以在图中使用的概念统称为模型元素。

在UML2.0里面,视图被分成三个视图域:结构、动态和模型管理,具体的视图和图如表27.1所示:

主要的域

视图

结构

静态视图

类图

对象图

用例视图

用例图

实现视图

组件图

部署视图

部署图

动态

状态视图

状态图

活动视图

活动图

交互视图

顺序图

协作图

模型管理

模型管理视图

类图

表27.1  UML视图和图列表

UML的视图和图基本上都具有可扩展性,这些扩展能力有限但是很有用,包括:约束、构造型和标记值,这里就不去介绍了。

本书主要会用到类图和顺序图,下面就简要的介绍一些关于类图和顺序图的基本知识,其它的图这里就不去涉及了,如有需要,请参阅相关的资料。

27.2  类图

27.2.1  类图的概念

       类图是静态视图的图形表达方式,表示声明的静态模型元素,如类、类型和其内容、以及它们的相互关系。换句简单点的话来说,类图就是用来描述类以及类与类之间关系的一种UML图。

27.2.2  类图的基本表达

       类图的基本模型元素如图27.1所示:

类的名字

属性

操作

图27.1  类图的基本图示

       也就是说,一个类的图形表示为长方形,长方形又分成三个部分,分别是类名、属性定义和操作也就是方法定义。

(1)类名的定义

       没有特殊要求,任何合法的名称都可以,类名通常为一个名词。给类命名时最好能够反映类所代表的问题的域中的概念,另外类的名字含义要准确清楚。

(2)属性定义的基本语法

       属性用来描述类所具有的特征。描述属性的语法格式为:

       可见性 属性名 :类型名 = 初值

       其中属性名和类型名是一定要有的,其它部分可选。

       对于可见性:+表示public,-表示private,#表示protected,没有符号就表示是缺省的可见性。基本的示例如图27.2所示:

 

图27.2  带属性的类图

       注意一点:Attribute和Property

虽然都是表示类的属性,但是一些属性只是在类内部使用,不对外的,一般称这些属性为Attribute;也有一些属性虽然是private的,但是会提供相应的getter/setter方法让外部来操作,把这些属性成为Property。具体的还是看个示例,给上面的类图添加一个名称为绰号,也就是“nickname”的Property,如图27.3所示:

 

图27.3  同时有Attribute和Property的类图

(3)操作定义的基本语法

       操作用来描述类能干些什么事情,也就是我们通常说的方法。描述操作的语法格式为:

       可见性 操作名(参数列表):返回值类型

可见性和属性的描述方式一样,都是+表示public,-表示private,#表示protected,没有符号就表示是缺省的可见性。参数列表由多个参数构成,用逗号分隔,描述参数的语法格式为:

参数名 :参数类型名

在上面的类图里面添加一个方法:人能够按照指定的速度和持续时间进行跑步运动,如图27.4所示:

 

图27.4  带操作的类图

(4)Java中static的表示

       在类图中,如果属性或者方法是static的,那么在属性或者方法定义的下面,添加一条下划线表示是static的。如图27.5所示:

 

图27.5  带static的类图

27.2.3  抽象类和接口

抽象类的表示是类名倾斜,抽象操作的表示是整条操作定义都倾斜,如图27.6所示:

 

图27.6  抽象类的类图

       接口是一种特殊的抽象类,归根结底还是类,所以接口的表达基本语法和类是一样的,比如一个有创建用户和删除用户的接口,定义示例如图27.7所示:

 

图27.7  接口的类图

       在其它UML图中,接口还可以用一个圆圈来表示,比如在组件图中。由于本书不涉及到这些知识,这里就不去示例了。

27.2.4  关系

       前面讲到,类图除了描述类本身之外,另外一个重点就是描述类与类的关系。在UML2.0中,类图描述的关系包括:关联、泛化(也叫通用化或者继承)、依赖、实现、使用和流这几种。大致如表27.2所示;

关系

功能

表达形式

关联

类实例之间的连接

标准的表达是一条直线:

泛化

概括描述和具体种类间的关系,适用于继承

 

依赖

两个模型元素之间的关系

 

实现

抽象说明和具体实现间的关系,如实现接口

 

使用

一个元素需要使用其它元素功能的关系

 

在相继时间内一个对象的两种形式的关系

 

表27.2所示  关系的种类

1:关联关系

       UML的关联用于描述类和类的连接。类与类之间有多种连接方式,每种连接的含义都是不同的,虽然语义不同,但是外部表象类似,因此统称为关联。

       关联关系一般都是双向的,也即是关联双方都能和对方通信,但是也有单向的关联。根据不同的含义,把关联分成了:普通关联、递归关联、限定关联、或关联、有序关联、三元关联和聚合等七种。本书涉及到了普通关联、递归关联和聚合这几种,下面分别来介绍一下这三种关联,其它的关联关系就不去讲述了。

(1)普通关联

       只要类与类之间存在关联关系就可以用普通关联来表示,标准的表示是一条直线,但是本书工具采用的是更严格的表达,如图所示:。带叉的这一端,表示关联的发起方,在另一端还可以通过一个箭头来表示被关联的一方,从而表示关联的方向,如图所示:

       来看个普通关联的示例,描述人和计算机的关系,如图27.8所示:

 

图27.8  普通关联示例

       图27.8中的数字表示重数,比如上面从人到计算机的关联,描述的是一个人拥有0到多个计算机。而另外一条从计算机到人的关联,没有重数,默认都是1,表示一台计算机属于一个人。重数表示示例如下:

0..1         表示      零到1个对象

0..*或*      表示      零到多个对象

5..8         表示      5到8个对象

2           表示      2个对象

没有标示    表示      1个对象

图27.8所对应的Java代码,示例代码如下:

public class 人 {

    private Collection<计算机> col;

}

public class 计算机 {

    private 人 a;

}

       这也是Java里面表达对象之间一对多关系的方式,也就是在一的这边,包含一个多的那边对象的集合,而多的这边,包含一个一的那边的对象。

(2)递归关联

       如果一个类与它本身有关联关系,那么这种关联关系被称为递归关联。

       递归关联描述的是同类的对象之间的语义关系,带有递归的含义,通常情况下都是一对多的关系。如图27.9所示:

 

图27.9  递归关联示例

       当然递归关联也可以是一对一,或者多对多的,这里就不去多讲了。

(3)聚合关联

       聚合关联是关联的一种特殊情况,如果类与类之间具有“整体与部分”的关系,使用聚合来表达。

根据语义又把聚合关联分成了三种:普通聚合、共享聚合、复合聚合(也叫组成)。

  • 普通聚合:描述类与类之间具有“整体与部分”的关系。比如班级和学生,班级是整体,而学生是组成班级的部分,如图27.10所示:

 

图27.10  普通聚合的示例一

       可以看出普通聚合的表达方式为,在表示关联关系的这端加上一个空心的菱形,空心的菱形紧靠着具有整体含义的这端,另一端可以没有标示,也可以加上箭头来表示一个方向性,如图27.11所示:

 

图27.11  普通聚合的示例二

  • 共享聚合:如果聚合关系中,处于部分方的对象参与了多个整体方对象的构成,描述成为共享聚合。比如学习兴趣小组和学生,学习兴趣小组是整体,而学生是组成学习兴趣小组的部分,但是一个学生可以参加多个学习兴趣小组,一个学习兴趣小组有多个学生,如图27.12所示:

 

图27.12  共享聚合的示例

       可以看出在普通聚合中,整体与部分是一对多,而共享聚合中是多对多了。跟普通聚合同样,可以在部分这边加上箭头,就不去示例了。

  • 复合聚合:如果构成整体类的部分类,完全隶属于整体类,那么这样的聚合成为复合聚合,也叫组成。比如一个图形界面和组成这个图形界面的按钮、文本框、Label等图形组件之间的关系,图形界面是整体,而各个图形组件是组成界面的部分,如图27.13所示:

 

图27.13  复合聚合的示例

       可以看出复合聚合也是一对多的,只是在一的这端,用一个实心的菱形来表示了。通常复合聚合表达的语义有这样的含义:如果整体对象不存在,那么部分对象也就没有存在的前提或意义了,也就是说整体与部分有非常强烈的包含关系。跟普通聚合同样,可以在部分这边加上箭头,就不去示例了。

2:泛化关系

       泛化又称通用化或继承,用来描述一个通用元素的所有信息能被另外一个具体元素继承的机制,继承某个类的类除了有自己的属性和操作外,还拥有被继承类中的信息。

       比如人员和学生,明显人员是父类,学生作为子类,如图27.14所示:

 

图27.14  泛化关系示例

3:实现关系

       就是描述类实现接口的关系。接口是对行为而非实现的说明,实现类来具体实现接口中的抽象定义。

       比如:写一个实现前面定义的用户操作接口,如图27.15所示:

 

图27.15  实现关系示例

4:依赖关系

       依赖关系是描述:如果某个对象的行为和实现,需要受到另外对象的影响,那么就说这个对象依赖于其它对象。基本上有关联的地方,严格说都有依赖。现在最常用的依赖关系是“使用”,意思是如果A使用了B,那么A就依赖于B。

       比如:写一个Client来使用上面定义的接口和实现,那么这个Client就会依赖接口和实现这两个类,如图27.16所示:

 

图27.16  依赖关系示例

Client中的代码示例如下:

public class Client {

    public static void main(String[] args) {

       UserEbi ebi = new UserEbo();

       ebi.createUser("Test", 20);

    }

}

       事实上,依赖关系描述的两个模型元素之间语义上的连接关系。常见的除了上面的直接调用外,还有:一个类使用另外一个类来作为操作的参数,一个类有以另外一个类作为类型的属性,甚至包括上面讲到的继承和实现等关系,都可以算是依赖。

27.3  顺序图

27.3.1  顺序图的概念

       顺序图是按照时间的先后顺序来描述消息是如何在对象间发送和接收的。顺序图有两个坐标轴,横坐标表示对象,纵坐标表示时间。顺序图又称为序列图或时序图。

顺序图中的对象,用一个带着纵向虚线的矩形块来表示,矩形块中写对象或类的名字,纵向的虚线表示对象的“生命线”。对象之间的交互用对象间的水平的消息线来描述,消息线的箭头表示消息的类型,消息的先后顺序就是对象交互的先后顺序。

       顺序图主要用来表示用例中行为的顺序,可以通过它来进行一个场景说明,或者是对某一个复杂业务功能或是流程执行先后的说明。简单点说,顺序图通常可以用来描述系统某次调用的运行顺序。

27.3.2  顺序图的基本表达

消息的表示方示如表27.3所示:

消息类型

表达方式

顺序消息

 

异步消息

调用

 

表27.3  消息的表示方式

       直接用例子来说明顺序图的基本表达方式,假若有A类和B类,A类会调用B类的方法,然后写个客户端来调用A类,现在要使用顺序图来画出客户端的调用顺序。

设若B类的示例代码如下:

public class B {

    public int b1(int a){

       return a+1;

    }

    public void b2(String message,int sum){

       System.out.println(message+"="+sum);

    }

}

A类的示例代码如下:

public class A {

    public void a1(int a){

       int sum = 0;

       B b = new B();

       for(int i=0;i<a;i++){

           sum += b.b1(i);

       }

       b.b2("求和的结果是", sum);

    }

}

Client的示例代码如下:

public class Client {

    public static void main(String[] args) {

       A a = new A();

       a.a1(5);

    }

}

1:UML2.0的顺序图示例

先来看看在UML2.0当中如何画出这个顺序图,如下图27.17所示:

 

图27.17  UML2.0顺序图示例

       对图27.17稍微说明一下:

  • 最外面那个大框框,在UML2.0里面称为interaction,就是表示一个交互的这么一个边界,左上角的sd Client.main2是它的名字,可以修改的。通常情况下,一个interaction应该和一个类中的某一个方法对应,相当于调用的起点,上面这个图表示的就是从Client类的main方法开始的顺序图,直白点说就是当Client的main方法被执行或调用的时候,系统地调用顺序
  • 带虚线的方块就代表对象,self就是表示interaction自身,也就是入口,也就是Client类的对象
  • 标号为1的那个从小黑点到对象self的一个调用,就是表示从外部来调用Client类,上面写着调用的方法是main,这条横线加箭头,就表示消息
  • 虚线上的矩形条表示对象被激活的生命周期,简单点说,就是在这一段对象被其它对象实用
  • 那个for的块,在UML2.0中表示Combined Fragment(组合片段或是),也就是用来进行块控制的,比如:if-else、for、while、try等等

大家看到这个顺序图的示例,会发现跟前面各个模式里面画的顺序示意图有很大的不同,的确是这样的,因为UML2.0的顺序图的语义丰富了不少,当然表达的越细致,那么图就会越复杂,因此,前面每个模式的运行顺序示意图,是采用的UML1.4的版本来画制的。因为UML1.4相对而言更简单一些,而且我们要表达的也比较粗略,只是想要描述出模式运行起来的大概顺序,并不深入细节。

2:UML1.4的顺序图示例

       使用UML1.4画出上面示例的顺序图,如图27.18所示:

 

图27.18  UML1.4顺序图示例图一

       图27.18生命周期下面的大黑叉叉,表示到这个地方销毁本对象实例。

       可能这个图,大家看起来要简单很多,至于后面的A和B对象画得比Client对象矮,是为了表示出运行到某个时间才创建的对象,当然也可以把它们放到一个水平线上,把上面的顺序图调整一下,可以画出如下的顺序图,如图27.19所示:

 

图27.19  UML1.4顺序图示例图二

       这个图27.19基本上就是前面画每个模式的运行顺序示意图的大概样子。由于前面画每个模式的运行顺序图的时候,很多都是文字说明,并没有跟真实的代码结合,所以都没有直接称为顺序图,而是称呼为顺序示意图,表示不是完整的顺序图,这点大家要了解一下。好在我们是把重点放在对模式运行顺序的理解上,并不是来讲述UML图如何画,所以不必把它们当严格的、完整的UML顺序图来看待。

       好了,对于UML的基础知识,这里就简略的介绍这么多,了解这些知识,对于看懂本书所绘制的UML图应该是足够了,如果想要了解更多的UML的知识,请参考专业的UML方面的资料。

 



---------------------------------------------------------------------------

私塾在线学习网原创内容  跟着cc学设计系列 之 研磨设计模式

研磨设计讨论群【252780326】

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/5892.html

---------------------------------------------------------------------------

相关笔记推荐
精品视频课程推荐

透彻理解JavaBean视频教程
深入浅出的讲解JavaBen的写法、JavaBean的用法、JavaBean的实现机制、JavaBean对应翻译的代码理解。

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

《设计模式综合项目实战》——跟着cc学设计系列精品视频教程

Ajax+JSON基础实战视频教程
数据校验、Javascript模拟多线程、下拉列表联动、操作XML、AJAX结合JSON的操作、Json-lib的使用

Javascript基础视频教程
JavaScript的内置对象--Array、String、Date、Math等,可以通过DOM对象进行对象控制,创建控制菜单及复选框的控制,创建二级联动列表框及列表框选项的移动,JavaScript项目,创建基于JS的商品管理系统。

浏览(6164)|评论(0)   交流分类:Java|笔记分类: 研磨设计模式

评论(0)
请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网