UML 类图介绍

一、 UML 简介

UML (
Unified Modeling Language )即统一建模语言,是
OMG ( Object Management Group )发表的图标式软件设计语言。

UML 的功能:

可视化:使用图表的形式来表现业务关系或者物理关系,可以促进对问题的理解和解决。

说明: UML 提供了一种通用的、精通的、没有歧义的通信机制进行。

建造: UML 通过自己的语法规则使得可以通过使用建模工具软件将设计模式映射到一种语言上。

建文档:使用
UML 进行设计可以同时产生系统设计文档。

UML 包括:

用例图(
Use case diagrams )

类图(
Class diagrams )

序列图(
Sequence diagrams )

合作图( Collaboration diagrams )

状态图( Statechart diagrams )

活动图( Activity diagrams )

构件图( Component diagrams )

部署图( Deployment diagrams )

(蓝色为较重要并且常用的图)

类图是最常用的 UML 图,显示出类、接口以及它们之间的静态结构和关系;它用于描述系统的结构化设计。

类图最基本的元素是类或者接口。

二、类图

1. 类( Class )

一般包含 3 个组成部分。第一个是类名;第二个是属性( attributes );第三个是该类提供的方法( 类的性质可以放在第四部分;如果类中含有内部类,则会出现第五个组成部分)。类名部分是不能省略的,其他组成部分可以省略。

类名书写规范:正体字说明类是可被实例化的,斜体字说明类为抽象类。

属性和方法书写规范:修饰符 [ 描述信息 ] 属性、方法名称 [ 参数 ] [ :返回类型 | 类型 ]

属性和方法之前可附加的可见性修饰符:

加号( + )表示
public ;减号(
- )表示 private ;
# 号表示 protected ;省略这些修饰符表示具有
package (包)级别的可见性。

如果属性或方法具有下划线,则说明它是静态的。

描述信息使用
<< 开头和使用 >> 结尾。

类的性质是由一个属性、一个赋值方法和一个取值方法组成。书写方式和方法类似。

例 1 :

public class TaxCalculator

{

private long taxRate ;

private int salary ;

public TaxCalculator(long taxRate)

{

this.taxRate = taxRate ;

}

public long countTax()

{

return taxRate*salary;

}

public int getSalary()

{

return salary;

}

public void setSalary(int salary)

{

this.salary = salary;

}

}

TaxCalculator

-taxRate:long

+TaxCalculator(a:long)

+countTax():long

salary:long

2. 包( Package )

包是一种常规用途的组合机制。 UML 中的一个包直接对应于 Java 中的一个包。在 Java 中,一个包可能含有其他包、类或者同时含有这两者。进行建模时,通常使用逻辑性的包,用于对模型进行组织;使用物理性的包,用于转换成系统中的 Java 包。每个包的名称对这个包进行了惟一性的标识。

例:



3.
接口( Interface )

接口是一系列操作的集合,它指定了一个类所提供的服务。它直接对应于 Java 中的一个接口类型。接口的表示有大概两种方式。具体画法见下例:

例:

public interface TaxCalculator

{

public long countTax();

public int getSalary();

public void setSalary(int salary);

}

画法一:

画法二:

画法二 :

画法二:

Interface

TaxCalculator

+countTax():long

+getSalary():int

+setSalary()

4. 关系

常见的关系有:一般化关系、实现关系、聚合关系、合成关系和依赖关系。请注意不同关系在图中连线表示的不同。

4.1 一般化关系( Generalization )

在有的书籍和资料中也叫做“泛化关系”。

一般化关系表示类与类、接口与接口之间的继承关系。关系中的箭头由子类指向父类。在 Java 中,用
extends
关键字来直接表示这种关系。

例:

public abstract class Employee{

}

public class Programmer extends Employee{

}

4.2 实现( Realization )

实例关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。关系中的箭头由实现接口的类指向被实现的接口。在 Java 中,实现关系可直接用
implements 关键字来表示。

例:

public interface CollegePerson{

}

public class Professor implements CollegePerson{

}

表示方法一:(在 Rose2003 下实现如下,连接线没有箭头,因为方向显而易见)

表示方法二:

表示方法二:


4.3 关联( Association )

表示类与类之间的连接。它使一个类的可见属性和方法被另一个类使用。关联可以是双向或者单向的。双向的关联箭头是可选的,单向的箭头指向遍历或者查询的方向。在 Java 中,关联使用实例变量来实现。在关联关系中可以使用附加的基数来说明类之间对应的个数。

基数

含义

0..1

零个或者一个实例

0..* 或者 *

没有限制,任意

1

有且只能一个实例

1..*

至少有一个实例

常见的基数

例:以权限中的用户组、用户角色为例,一个用户角色可以属于一个或者多个用户组,一个用户组则可以包含多个用户角色。如果用户组采用下面的方法来获得用户角色的权限 …

public class UserGroup{

private UserRole uRole ;

......

}

public class UserRole{

}

则表现在图中为:(注意箭头的画法)

注意:一个关联关系往往是聚合关系或者是合成关系。

注意:一个关联关系往往是聚合关系或者是合成关系。

4.4 聚合( Aggregation )

聚合是关联的一种形式,代表两个类之间的整体 / 局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。在 Java 中,聚合也是使用实例变量来实现的。


关联和聚合的区别纯粹是概念上的,在 Java 语法上分辨不出来的。聚合还暗示着实例图中不存在回路。换言之,只能是一种单向关系。

例:汽车与轮胎的关系可以很好的说问题。

public class Car{

private Tyres tyres;

}

public class Tyres{

}

4.5 合成( Composition ):[可以认为关系更强烈]

合成是聚合的一种特殊形式,暗示 “ 局部 ” 在 “ 整体 ”
内部的生存期职责。合成关系是不能共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。

例:人和他的腿就是一个好的例子。

public class Man{

private Legs legs;

}

public class Legs{

}

4.6 依赖( Dependency )

依赖也是类与类之间的连接,并且依赖总是单向的。实体之间一个 “ 使用 ” 关系暗示一个实体的规范发生变化后,可能影响依赖于它的其他实例。更具体地说,它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。其中包括一个局部变量,对通过方法调用而获得的一个对象的引用(如下例所示),或者对一个类的静态方法的引用(同时不存在那个类的一个实例)。也可利用 “ 依赖 ” 来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的各个类之间的关系,表示出包和包的关系。

例:给一个雇员计算薪水的时候 , 要使用计算器的例子

public class Employee{

public void calcSalary(Calculator cSalary)

{

}

}



三、小结

在这里主要介绍了在阅读、设计类图中可能遇到的细节。希望能对大家有所帮助。由于个人水平有限,对 UML 认识不深,所以在正文中可能存在一些问题和不足,希望大家指正。

UML 类图介绍的更多相关文章

  1. 北风设计模式课程---20、UML类图介绍

    北风设计模式课程---20.UML类图介绍 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装备工厂先生 ...

  2. UML类图介绍&类的六大关系

    UML类图介绍&类的六大关系 官方定义 UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,用于帮助软件开发人员进行思考和记录思路的方式 UML 图形化的语言 基本介绍 UML图: ...

  3. UML类图介绍以及PlantUML使用方法

    类的UML表示方法 UML介绍 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是 ...

  4. UML类图介绍(转载)

    UML类图详细介绍   类图主要描述程序对象以及他们之间的关系.一般来说,类.接口.抽象类这些程序对象的区别很容易,但是他们之间六种关系以前总是理解不够深刻,这次进行了一次复习,顺便写成博文以便加深理 ...

  5. UML类图介绍及简单用法

    原文链接 一.类的属性的表示方式 在UML类图中,类使用包含类名.属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和em ...

  6. UML类图介绍

    一.概述 UML类图用来定义系统中的类,包括描述类的结构和类之间的关系.类图的主要作用于描述系统的静态结构. 类图的基本模型元素如下:

  7. UML类图新手入门级介绍

    UML类图新手入门级介绍 举一个简单的例子,来看这样一副图,其中就包括了UML类图中的基本图示法. 首先,看动物矩形框,它代表一个类(Class).类图分三层,第一层显示类的名称,如果是抽象类,则就用 ...

  8. [转帖]UML类图新手入门级介绍

    UML类图新手入门级介绍 2010-11-12 19:45:00 monkey_d_meng 阅读数 27230  收藏 文章标签: umlinterfaceclass编程扩展更多 分类专栏: 软件工 ...

  9. UML类图的6大关系

    <小酌重构系列>已经完成了大约1/3了,在这些文章中,我使用了一些简单的类图来描述重构策略.在之后的文章中,我可能会借助稍微复杂一些的UML类图来介绍.但是在此之前,我觉得有必要先介绍一下 ...

随机推荐

  1. RedHat无法使用yum源问题

    RedHat下的yum是需要注册才能使用的 使用的话会提示: [root@test ~]# yum clean all Loaded plugins: product-id, refresh-pack ...

  2. 吴裕雄--天生自然Linux操作系统:Linux 云服务器

    自己安装服务器还是麻烦了些,现在一般都推荐大家使用云服务器,比较方便,价格也不贵. 腾讯云 以下几款性价比非常高,有几款是需要抢购的,大家看好时间基本能拿到. 1.1核2G 99/年,可以用来学习,L ...

  3. Ubuntu python多个版本管理

    1.查看python有哪些版本使用命令 whereis python 如图: 2.这么多版本如何切换呢 使用 sudo update-alternatives --install <link&g ...

  4. 第二季第十一天 html5语义化标签 css透明度

    span不能设置宽高背景 HTML5语义化标签 <section>标签所包裹的是有一组相似的主题的内容,可以用这个标签来实现文章的章节.标签式对话框中的各种标签页等类似的功能. <s ...

  5. JavaSE--枚举类

    参考:http://www.cnblogs.com/hyl8218/p/5088287.html 枚举类声明定义的类型是一个类,因此尽量不要构造新对象. 所有枚举类型都是 java.lang.Enum ...

  6. arg min,arg max, e.g ,i.e

    数学中常见的arg min,arg max 是什么意思 arg 是变元(即自变量argument)的英文缩写 arg min 就是使后面这个式子到达最小值时的变量的取值 arg max 就是使后面这个 ...

  7. js变量的相关要点

    如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量. JavaScript 变量生命周期在它声明时初始化. 局部变量在函数执行完毕后销毁. 全局变量在页面关闭后销毁.

  8. document.write的时机

    document.write第一次加载进入页面的时候会紧跟文档,写入内容.但是如果在文档已经加载完毕之后,再通过点击的方式调用函数的话会直接把整个文档覆盖掉.

  9. SQL case when else 语句:选出年份等于1970的,选出的结果用科目和获奖者排序,同时把经济和化学2科放到最后:SELECT * FROM nobel_win WHERE year=1970 ORDER BY CASE WHEN subject IN ('Economics','Chemistry') THEN 1 ELSE 0 END ASC, subject, winner;

    SELECT * FROM nobel_win WHERE year=1970 ORDER BY  CASE WHEN subject IN ('Economics','Chemistry') THE ...

  10. 让几个横向排列的浮动子div居中显示的方法

    div设置成float之后,就无法使子div居中显示了,那么如何让几个横向排列的浮动的div居中显示呢,下面有个不错的方法,希望对大家有所帮助 div设置成float之后,在父div中设置text-a ...