前言

类图和序列图是UML中最常用的两种Diagram。我将做详细的总结。在许多书中,或者网站中,在介绍一个系统的子系统的设计时,很多时候,都是给出简单的类图来简述构成子系统的类之间的关系。这足以说明类图的重要性。 对类图的基本认识有以下两点:

  1. 类图是以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法;
  2. 类图中的类与面向对象语言中的类的概念是对应的,是对现实世界中的事物的抽象。 我们基于以上两点,来对类图进行更详细的学习。

类图中基本语法学习

在UML中,画每一种图,都有一套规范的,不同的符号是不同的意义,我们要熟悉这些符号的意义,才能理解一副类图的意义。 先来一副画好的类图,从解析这个类图开始:

如图,这是一副很简单的类图,很简单,也很熟悉。 可以看到,这个类图,从上到下分为三部分。是的,一般类图从上到下分为三部分,分别是:

  1. 类名
  2. 属性
  3. 操作

正如你所看到的,上面类图的名称是Student,属性有Name, Sex, Age, 对应的操作有六个。你应该知道一个类图的Student是必须存在的,而属性和操作是可选的。如果,你看到了一个没有任何属性和操作的类时,也不要感到惊讶,那是正确,虽然不是很正常。 类的名字没有什么好说的,那么,我从属性开始,例如以下属性: - Name:String 如果你看过Objective-C,你也许就不会感到惊讶,为什么有减号和加号了,但是,伙计,这里的减号和加号和Objective-C中的意思是完全不同的。 这里的加号和减号表示的是属性和方法的可访问性,有如下定义:

  1. -表示private
  2. +表示public
  3. #表示protected

Name表示的是属性的名称,而它后面的String表示的是这个属性的类型; 那么现在对于- Name:String就好理解了;它表示Student类中定义的一个私有的String类型的属性Name;而对于图中这样的一个特例: - Age:int=10 在这里,int=10,表示的Age属性的默认值为10。

最下面是类的操作,“+”的意思,已经解释过了。我选取以下的一个操作进行详细讲解: + SetAge(Age:int):void 操作名为SetAge,参数为int类型的Age,操作的返回值为void。有的时候,我们会遇到以下的这种语法: + SetAge(in Age:int):void 是的,多了一个in关键字,这个关键字表示这个Age参数是输入参数,如果看过C#的话,理解其中的out关键字,我想in就不用我多讲了。

抽象类

看下面这个图:

你会发现类名和Eat方法是以斜体字体表示的;在类图中以斜体表示也是有特殊意义的,上图表示Animal是一个抽象类,抽象类是不能实例化的,一般至少包含一个抽象操作,比如上图的Eat就是抽象操作。

接口

看下图这个图:

这是接口的表示方法。接口是什么,不用做什么解释。这里让大家对接口图有一个大体的了解。

类图之间的关系

对于类图的基本讲解就到这里了,接下来讲解类图中最重要的一部分,也是比较难理解的一部分:类图之间的关系。 一个负责的系统,每个类不是独立存在的,而是类与类组织起来的,而每个类之间的关系是错综复杂的,那么UML是如何表达其中的关系的呢?

继承关系

继承关系是一种基本而重要的关系;至于继承的概念,我就不做解释了,而只讲UML中对继承的表示。

以上两张图,都是Astah中对继承关系的表示方法,继承通过指向超类的一条闭合的,单箭头的实线表示。这个表示和用例图中的泛化表示方式是一致的,不熟悉的朋友,可以去看看UML用例图总结这篇文章。

关联关系

当系统建模时,特定的对象间会彼此关联,而且这些关联本身需要被清晰地建模,这里我会介绍5中关联,关于什么时候使用哪种关联,这里是不做介绍的,这里而是将重点集中在每种关联的用途,并说明如何在类图上表现出来。

双向的关联

关联是两个类之间的连接,关联总是被假定是双向;这说明,两个类彼此知道它们之间的关系,都可以调用对方的公共属性和方法;虽然在分析阶段这种关系是适用的,但我觉得对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针;对象引用本身就是有向的。这种关系在设计的时候比较少用到,关联一般都是有向的。

单向关联 在一个单向关联中,两个类是相关的,但是只有一个类知道这种关系的存在。如下图:

一个单向的关联,表示为一条带有指向已知类的开放箭头的实线。Class0知道Class1的存在,而Class1不知道Class0的存在,Class0可以调用Class1的公共属性和方法。使用Astah导出代码时,单向关联体现为Class0中包含一个Class1对象。

关联类 这个概念有点不好理解,我也是参考别人的理解,再做出自己的理解,如下图:

Person和Company是有关系的,存在什么关系?存在一个雇佣的关系,由于存在一个Job,导致Person和Company产生了关系,但是在建模时,由于Job将Person和Company关联到了一起,而描述Job的Salay放在Person或者Company都不是很合适的,由于不同的岗位有不同的Salary,如果将岗位和Salary放在Person,将导致Person类存在很高的耦合性。所以关联出一个关联类Job,表示岗位信息。从图中可以看出,Job类即是一个关联关系也是一个类,是为了描述类Person与类Company之间的关联关系的。

聚合 聚合是一种特别类型的关联,用于描述“总体到局部”的关系。 基本聚合 在基本聚合中,部分类的生命周期独立于整体类的生命周期;如下图:

房子是一个整体实体,而窗户是房子的一部分,而窗户可以在建房子之前就创建,在这里,Window实例清楚地独立地Car类实例而存在。使用空心的菱形表示。

组合聚合 组合聚合也叫包容,但是子类实例的生命周期依赖于父类实例的生命周期;如下图:

公司是一个整体实体,公司包含部门,部门不能独立于公司而存在。使用实心菱形表示。

自身关联(反射关联) 就是自身关联自身,你可能想不到这样存在的意义,但是,你要想到,类可以是抽象的,当一个类关联到它本身时,这并不意味着类的实例与它本身相关,而是类的一个实例与类的另一个实例相关,可以表现为多肽,在UML中就是如下图所示:

实现接口

如下图:

在UML中表示的很简单,就是将泛化中的实线变成了虚线就好了。

总结

这篇文章大体的对UML类图做了一个总结,平时工作中涉及到的内容都大体上做了介绍,如果有什么遗漏,请大家指出。同时,在本文中所有的类图都是使用Astah画的,关于使用Astah画类图,大家可以参考:UML工具Astah的使用

附录

多重值和它们的表示

表示 含义
0..1 0个或1个
1 只能1个
0..* 0个或多个
*
0个或多个
1..* 1个或多个
3 只能3个
0..5 0到5个
5..15 5到15个

博客转自:《UML类图总结

[转载]UML类图总结的更多相关文章

  1. [转载]uml 类图依赖与关联的区别

    原文链接:https://www.cnblogs.com/liuzhang/archive/2013/03/17/2964095.html 最近研究设计模式,看类图有点发虚!有些关系搞的不是很清楚.所 ...

  2. 【转载】UML类图几种关系的总结

    因为有的时候很久不弄UML图,老是忘记几个常见的连接线的意思,这篇完全说转载:UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Real ...

  3. 【转载】UML类图中箭头和线条的含义和用法

    文章转载自 http://blog.csdn.net/hewei0241/article/details/7674450 https://blog.csdn.net/iamherego/article ...

  4. 转载:23种常用设计模式的UML类图

    转载至:https://www.cnblogs.com/zytrue/p/8484806.html 23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源 ...

  5. 【转载】UML类图知识整理

    原文:UML类图知识整理 UML类图 UML,进阶必备专业技能,看不懂UML就会看不懂那些优秀的资料. 这里简单整理 类之间的关系 泛化关系(generalization) 泛化(generalize ...

  6. UML类图介绍(转载)

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

  7. UML类图几种关系的总结 ---(转载)

    在UML类图中,常见的有以下几种关系:泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Compositi ...

  8. [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图

    [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...

  9. UML类图归纳

    作为一个程序员,掌握UML类图是开发和阅读程序的基础. 转载请注明地址http://www.cnblogs.com/zrtqsk/p/3739288.html,谢谢! 一.基本介绍 UML是一种标准的 ...

随机推荐

  1. 定时自动关闭messagebox

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. java 类反射记录

    Class的getDeclaredMethod方法是获取当前类下的所有方法,包括private修饰的,该方法不获取父类的方法. getMethod获取父类及本类下的所有public方法.

  3. C++的四种cast操作符的区别--类型转换(转)

    转自:     http://welfare.cnblogs.com/articles/336091.html Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 r ...

  4. C++混合编程之idlcpp教程Python篇(5)

    上一篇在这  C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...

  5. 修改TFS2013服务账户或者密码

    修改TFS2013服务账户或者密码 TFS作为微软软件开发的全生命周期管理解决方案,可以很好的与windows的域管理结合使用,方便多系统下用户的管理和授权.如果TFS使用的服务账户设置的域账户密码过 ...

  6. [后端人员耍前端系列]KnockoutJs篇:使用KnockoutJs+Bootstrap实现分页

    一.引言 由于最近公司的系统需要改版,改版的新系统我打算使用KnockoutJs来制作Web前端.在做的过程中,遇到一个问题——如何使用KnockoutJs来完成分页的功能.在前一篇文章中并没有介绍使 ...

  7. Backbone源码解析(五):Route和History(路由)模块

    今天是四月十二号,距离上次写博已经将近二十天了.一直忙于工作,回家被看书的时间占用了.连续两个礼拜被频繁的足球篮球以及各种体育运动弄的精疲力竭,所以很少抽时间来写技术博客.今天抽出时间把backbon ...

  8. Sensor(PROXIMITY)

    package com.example.sensor01; import android.hardware.Sensor; import android.hardware.SensorEvent; i ...

  9. Linux4:useradd、userdel、passwd、groupadd、chgrp、chown、df、du、sort、wget

    useradd 添加新的用户账号,只有root账户可以操作 -d 目录:指定用户主目录(默认在home下),若此目录不存在可同时使用-m创建主目录 -g 用户组:指定用户所属的用户组 -G 用户组:指 ...

  10. DeviceOne接受了DevStore的专访

    DevStore隶属深圳尺子科技有限公司,DevStore所有内容(资讯.数据.工具|服务.资源文章.问答……)都贯穿整个项目的生命周期,无论你是设计人员.开发人员.推广人员还是运营人员都可在此找到你 ...