UML类图是UML(unified modeling language,标准建模语言)五种图示法中静态图的一种-用来描述系统中类的静态结构,不仅定义系统中的类,表示类之间的联系如关联、依赖、聚合等,也包括类的内部结构(类的属性和操作)。类图描述的是一种静态关系,在系统的整个生命周期都是有效的。

  如果诸位看官们有拜读过一些关于设计模式的动动,就一定有接触UML类图,可以说学习类图是设计模式之旅的起点,下面我们来看一个示例。

一,类的表示

  想必电影终结者是深入人心,既然我的英文名与主角同名,那就来个终结者T-800(阿诺肌肉辛格)把。

    

  通常UML类图中的一个节点就是一个类或者接口。从这个T-800的类我们可以看出,

  • 类是由一个三层的矩形组成的:顶部显示类名,中部显示特性(属性或字段等),底部显示操作(方法或行为)
  • 特性的格式是: 可见性修饰符 属性名:类型 <=默认值>。T-800的特性有型号,目标等。
  • 操作的格式是: 可见性修饰符 操作名(<参数列表>):返回类型。操作参数的格式则是<in/out>参数名:类型。in/out来指示参数是输入还是输出类型。T-800的操作是重启。
  • 在UML类图中可见性'+'表示public,'-'表示private,'#'则表示protected。

  除了上述例子中可见的UML类图的规则之外,这里再补充几点:

  • 如果这个类是抽象类,那么类名就必须使用斜体字。
  • 如果在一个类图中我们只想显示高层细节,那下面的两个区域的信息不是必要的。
  • 操作的参数in/out,除非使用早期的编程语言,这个in/out指示器会有所帮助,一般情况下省略。

二,接口的表示

  接口的表示有两种方式:

  • 矩形表示与类的表示相似,不过需要在接口名称上方标注<<interface>>,并且接口只有两个部份,接口名和方法。
  • 棒棒糖表示法,在棒棒糖的名字就是接口的名字,其方法写在负责实现它的类的操作部份。这里省略了T-800的特性和操作细节。

三,UML类图中的关系

  1.泛化关系(Generalization):使用带空心三角形的实线表示。

  不管是基本款T-800还是液体金属T-1000,还是最新款的T-X,它们都属于终结者系列机器人: 

  

  

  泛化关系相当于面向对象中的继承关系。类T-800,T-1000,T-X都继承自抽象类(注意类名是斜体)终结者类,则称终结者类是前三者的一个泛化。

  在UML中对泛化关系有三个要求,

  • 子类需要继承父类所有的特性和操作,如上述的三个子类都继承了父类的型号和目标字段。
  • 子类中除了与父类一致的信息外,还应包括额外的信息。比如新的操作:T-800可以重启(重新设定目标),T-1000可以液化,T-X能控制其他机械。
  • 可以使用父类的地方,也可以使用子类。

  2.实现关系(Emlpementation):使用带空心三角形的虚线表示。

  在上面的例子中T-800实现了攻击接口,就引申出了实现关系。

  

  在UML中接口就是一个操作的集合。

  3.依赖关系(Dependency):使用带箭头的虚线表示

  机器人们依赖于内部的指令来行动。也可以通过指令来重启T-800来执行其他任务。

  

  依赖是一种最弱的横向关系。假设A类的变化引起了B类的变化,则称B依赖于A。表现在代码上依赖关系一般有如下三种情况:

  • A类是B类中(某个方法)的局部变量。
  • A类是B类中某个方法的参数。
  • A类向B类发送消息,从而影响B类变化。

  4.关联关系(Association):使用实线表示(可带箭头)。

  从这开始大家可能就会混掉了。不过没关系,最后会辨析这几种关系。如果看官们熟悉魔兽世界,两个一起打22竞技场的好基友就是1对1的关联关系。

  

  如果甲是治疗,那这个实线就可以带箭头指向乙。因为只需要前者奶好后者,后者只管砍敌人(当然这是很低端的做法吼吼)。

关联往往是相互的。关联的两个对象彼此间没有任何强制性的约束,可以随时解除关系或是进行关联,生命期问题上没有任何约定。

  被关联的对象还可以再被别的对象关联,所以关联是可以共享的。

  数字表示了关联两者之前的多重性,一般有“*”表示不限,“1”表示有且只有一个,“0...”表示0个或多个,“0,1”表示0个或1个,“m...n”表示m~n个,“m...*”表示至少m个。

  5.聚合关系(Aggregation):使用带空心棱形的实线表示。

  聚合关系表示一种弱的整体对部份的拥有关系。主要体现在两者的生命周期不同,部份可以脱离整体存在。

  被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。

  比如魔兽中的天灾军团,天灾们受巫妖王的思想控制,现在小阿被脚男们推倒干掉了天灾军团完蛋了,

  旗下的死亡骑士们就追随黑风骑士团效忠联盟或者部落,并不意味着他们也就OVER了。

  

  其实聚合也是关联关系的一个特例。但更紧密,你会跟女朋友亲密的分享一切,但不会给一个来串门的朋友配自己家的钥匙把。

  6.组合关系(Composition):使用带实心棱形的实线表示。

  组合关系表示一种强的整体对部份的拥有关系。

  在终结者系列电影中,天网是一套拥有了自己意识军事防御体系的控制程序,控制着麾下的所有机械军团。

  天网系统被摧毁,机械军团就成了一堆废铜烂铁了。(刚才跑题到魔兽世界去了,呃....)

  

  主体控制着部份的创建和销毁或转移,部份的生命周期由主体掌握。这就是组合关系。其实也是关联关系的一种特例。

四,几种关系的联系与区别

  泛化与实现是两个纵向关系,这两者没什么异议很好区别。

  依赖,关联,聚合,组合这四个横向关系,由弱到强,区分倒是比较麻烦。

  依赖(...use a...) 与其他三者最大的区别在于仅仅是使用,并不持有其依赖对象的引用。代码的表现就是并不是类的成员之一,而是其方法的参数或局部变量。

  聚合(... owns a ...),组合(... is a part of  ...),都是关联(...has a...)的特例。

  但关联更倾向与两个独立平等的事物之前的关系,比如好基友,或者好朋友,然而聚合和组合倾向于整体和部份的关系。

  聚合和组合的区别,只是在于整体对部份生命周期的把握程度。

  聚合就像是电脑坏了的话,硬盘之类的东西是可以继续用的。组合就像是二极管收音机坏了,那就整个报废了(对于一般人来说...高手不要吐槽说你会修...)

  ----------------------------------------------偶是分割线---------------------------------------------------

  End:补充一下类图中的注释Like this:

  

  最近在学习设计模式,可能的话后面会推出一个系列。我写的动动一般都是面对跟我一样的初学者。希望大家到时候捧场吼吼!

  以上的图都是使用MS Visio画出来的,如果大家感兴趣我也可以写一篇关于使用Visio画UML类图的文章^_^。

【转】学习设计模式之前你必须掌握的-看懂UML类图的更多相关文章

  1. 设计模式学习笔记之看懂UML类图

    什么是UML: UML(统一建模语言)是当今软件设计的标准图标式语言.对于一个软件系统而言,UML语言具有以下的功能:可视化功能.说明功能.建造功能和建文档功能. UML都包括什么类型的图: 使用案例 ...

  2. 设计模式学习(二):面向对象设计原则与UML类图

    一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...

  3. 《设计模式》读懂UML类图

    一.类中的主要关系 继承.实现.组合.聚合.依赖.关联 二.UML类图 三.代码实现 public class H2O { } public class O2 { } public interface ...

  4. 设计模式学习起点 UML类图笔记

    UML类图笔记 大学开设的软件设计课程一般都会学习UML类图,大部分关于设计模式的描述都是使用的UML类图,可以说类图的表示是学习设计模式的起点.UML定义类之间的关系主要有六种:泛化关系.实现关系. ...

  5. Java 大黑话讲解设计模式 -- UML类图

    目录 1.啥是UML类图? 2.UML类图有啥用? 3.正式理解UML类图 4.使用idea画第一个UML类图 5.类之间的关系图[必须牢记] 6.类之间的关系 6.1.依赖 6.2.泛化 6.3.实 ...

  6. 设计模式之UML类图

    在学设计模式的过程中经常碰到各式各样的UML类图.那些眼花缭乱的符号有什么含义呢? 类图含义 类图中的关系 从网上找来一张图作为实例 依赖关系:比如动物依赖氧气和水,这里如学生要依赖自行车.用虚线箭头 ...

  7. 设计模式学习笔记(详细) - 七大原则、UML类图、23种设计模式

    目录 设计模式七大原则 UML类图 设计模式分类 单例模式 工厂设计模式 简单工厂模式 工厂方法模式(使用抽象类,多个is-a) 抽象工厂模式(使用接口,多个like-a) 原型模式 建造者模式 适配 ...

  8. 设计模式——1.概述&UML类图和时序图

    声明:本博客设计模式相关文章均整理和修改自网络,原文地址:图说设计模式 学习设计模式的3个层次—— 1.熟悉所有设计模式: 2.能够用代码实现: 3.运用到工作的项目中. 设计模式指导软件开发,学习设 ...

  9. 学习一之UML类图

    前言 最近在学习程杰老师的<大话设计模式>,觉得非常不错,就做了一些学习笔记和总结.如果对设计模式很感兴趣的,可以直接阅读书籍,相信会有更多的收获. 本人小菜一枚,如果理解的不对的还请多多 ...

随机推荐

  1. GoAccess自动分割Nginx日志

    GoAccess 是一款开源的网站日志实时分析工具.GoAccess 的工作方式很容易理解,就是读取和解析 Apache/Nginx/Lighttpd 的访问日志文件 access log,然后以更友 ...

  2. ThreadLocal的内存泄露

    ThreadLocal的目的就是为每一个使用ThreadLocal的线程都提供一个值,让该值和使用它的线程绑定,当然每一个线程都可以独立地改变它绑定的值.如果需要隔离多个线程之间的共享冲突,可以使用T ...

  3. Python + selenium之unitest(2)

    unittest单元测试框架中重要的概念: 1.Test Case 一个Test Case实例就是一个测试用例.在一个完整的测试流程中,包括测试前准备环境的搭建(setUp),实现测试过程的代码(ru ...

  4. hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)

    证明看这http://hihocoder.com/contest/hiho44/problem/1 思路: 设 sg=a[1]^a[2]^...a[n],若sg=0,则先手Alice必败,否则必赢. ...

  5. RAC数据库后台进程介绍

    在RAC数据库上会比单实例数据库多一些进程,这些进程是RAC特有的,为了实现集群数据库功能而设置的. 10g RAC特有进程:$ ps -ef|grep ora_oracle    4721     ...

  6. 【UML】时序图Sequence diagram(交互图)(转)

    前言         UML时序图是UML动态图之一,它是强调时间顺序的交互图. 定义         时序图是显示按时间顺序排列的对象之间交互的图. 组成元素   对象         包括三种命名 ...

  7. bzoj3209:3209: 花神的数论题

    觉得还是数位dp的那种解题形式但是没有认真的想,一下子就看题解.其实还是设置状态转移.一定要多思考啊f[i][j]=f[i-1][j]+g[i-1][j] g[i][j]=f[i-1][j-1]+g[ ...

  8. Spring boot 集成 Dubbo 快速搭建

    架构: 1.ZooKeeper:服务注册中心 2.api工程:提供对外暴露的服务API 3.provider:服务提供者 4.consumer:服务消费者 示例如下: (一)新建 Maven 项目 a ...

  9. Java获取yml里面的配置

    #yml文件配置systemPath: #档案系统地址 dossier: http://127.0.0.1:8088/ //调用说明 配置文件里必须包含节点 否则项目无法启动 @Value(" ...

  10. 2019.05.26 周日--《阿里巴巴 Java 开发手册》精华摘要

    一.写在开头 Java作为一个编程界最流行的语言之一,有着很强的生命力.代码的编写规范也是不容忽视的,今天,我就把自己阅读的国内的互联网巨头阿里巴巴的<阿里巴巴 Java 开发手册>一些精 ...