文章目录

  • 前言
  • UML 类图
    • 1. 类图的自身结构
    • 2. 关联关系
      • 2.1. 自关联
      • 2.2. 单向关联
      • 2.3. 双向关联
    • 3. 聚合关系
    • 4. 组合关系
    • 5. 依赖关系
    • 6. 继承关系
    • 7. 实现关系

前言

统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言,它统一规范了各种图形的
含义,设计者按照 UML 规范去画图,看图者就能迅速掌握设计者的思路

UML 以不同的角度,将图形归类为,用例图、类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署
图、包图、组合结构图、交互概览图共 13 种图形,学习设计模式主要用到的是类图,所以本文会记录类图的用法

UML 类图

类图是一种静态的结构图,它能描述类或接口自身的结构(类名,类的属性,类的方法),也能描述类与类之间的
关系(关联关系、聚合关系、组合关系、依赖关系、继承关系、实现关系)

关联关系、聚合关系、组合关系,这三个是非常容易混淆的概念,因为这三个关系都是以类成员属性的方式实现,
实现它们的语法是相同的,只能从概念进行区分,后面会详细介绍每个关系的特点,注意总结它们的区别

1. 类图的自身结构

类图自身的结构由三部分组成(名称区域、属性区域、方法区域 )(下面 中括号 里的内容属于可选项):

  1. 名称区域: 类名或接口名,接口时,要分为两行,第一行写 <<Interface>>,在第二行写接口名
  2. 属性区域: 成员访问级别 属性名称 : 属性类型 [ = 属性缺省默认值 ]
  3. 方法区域: 成员访问级别 方法名称(参数列表) [ : 方法返回类型 ]

成员访问级别分为:

  • 公共 (public):+
  • 私有 (private):-
  • 父子类或相同包下 (protected):#

1. 示例:类图的自身结构

通过上图我们可以得到信息:

  1. 这是一个名字为 Person 的类
  2. 包含一个成员属性 name,该属性的访问级别为公共、属性的类型是 String、 属性的默认值是 “ares5k”
  3. 包含一个成员属性 age,该属性的访问级别为私有、属性的类型是 int
  4. 包含一个成员方法 setName,该方法的访问级别为公共、方法需要一个 String 类型的参数
  5. 包含一个成员方法 getName,该方法的访问级别为公共、方法的返回值是 String 类型

2. 示例:接口的完整表示方式

接口和类的结构同理,我们可以得到如下信息:

  1. 这是一个名字为 Runnable 的接口
  2. 包含一个方法 run,该方法的访问级别为公共、方法的返回值是 String 类型

2. 关联关系

关联关系又分为自关联、单向关联,双向关联,实际代码中,这种关系通过成员属性的方式实现

关联关系的特点:这种包含关系更强调两个类是使用关系,而非整体与部分的关系,比如人和车,从事物本身来
讲,车不属于人的一部分,人只是单纯要使用车

2.1. 自关联

表示自关联关系需要满足两点:

  1. 拥有一个带有实心三角箭头的实线
  2. 该实线的箭头和线尾部都指向自身


上图是一个自关联关系,容器是一个单独的物体,从事物本身来讲,另一个容器 subContainer 并不应该是它的一部
分, 容器中包含另一个容器 subContainer 单纯是为了使用

用 Java 代码实现上图关系:

/*** 容器类*/
class Container {/*** 容器中要使用其他容器*/public Container subContainer;
}

2.2. 单向关联

表示单向关联关系需要满足三点:

  1. 拥有一个带有实心三角箭头的实线
  2. 该实线的箭头指向其关联的另一个类图
  3. 该实线的线尾部指向自身


上图是一个单向关联关系,从事物本身来讲,车不属于人的一部分,人只是单纯要使用车

用 Java 代码实现上图关系:

/*** 汽车类*/
class Car {}/*** 人类*/
class Person {/*** 人要使用小汽车*/public Car car;
}

2.3. 双向关联

表示双向关联关系需要满足两点:

  1. 拥有一个没有箭头的实线
  2. 该实线连接两个相互关联的类图


上图是一个双向关联关系,从事物本身来讲,鱼不属于猫的一部分,猫也不属于鱼的一部分,它们两个关联,
完全是吃与被吃的关系

用 Java 代码实现上图关系:

/*** 猫类*/
class Cat {/*** 猫要吃鱼*/public Fish fish;
}/*** 鱼类*/
class Fish {/*** 鱼想知道被哪个猫吃了*/public Cat cat;
}

3. 聚合关系

聚合关系通过成员属性的方式实现,它的特点:从事物本身的角度看,成员类可以单独存在,而主类必须依赖成员
类,比如,商品可以单独存在,而订单必须包含商品,否则就没有意义

表示聚合关系需要满足三点:

  1. 拥有一个带有空心菱形箭头的实线
  2. 该实线的箭头指向自身
  3. 该实线的尾部指向其需要聚合的另一个类图


上图是一个聚合关系,它展示了订单必须聚合商品

用 Java 代码实现上图关系:

/*** 商品类 - 该类可以单独存在*/
class Goods {/*** 商品名称*/public String goodsName;
}/*** 订单类*/
class Order {/*** 订单需要包含商品,否则订单就没意义*/public List<Goods> goodsList;
}

4. 组合关系

组合关系通过成员属性的方式实现,它的特点:从事物关系的角度讲,主类必须依赖成员类,而成员类也不能单独
存在,它单独存在没有意义,必须被包含在主类中,比如,嘴巴单独存在就没有意义,它必须包含在头中

表示组合关系需要满足三点:

  1. 拥有一个带有实心菱形箭头的实线
  2. 该实线的箭头指向自身
  3. 该实线的尾部指向其需要组合的另一个类图


上图是一个组合关系,发动机单独存在没有意义,必须包含在汽车内才可以

用 Java 代码实现上图关系:

/*** 发动机类 - 该类不能单独存在,因为发动机如果不在汽车中就没有意义*/
class Engine {/*** 发动机马力*/public int power;
}/*** 汽车类*/
class Car {/*** 需要引擎才能组合成一个汽车*/public Engine engine;
}

5. 依赖关系

依赖关系会被定义在方法参数或局部变量中,它的特点:偶然参与性,从事物本身来讲,被依赖的类并不属于主
类的一部分,但是在主类的某些行为中,可能会需要其参与,比如,车子并不是人的一部分,但人有很多行为,当
中开车的行为就需要车子的参与

表示依赖关系需要满足三点:

  1. 拥有一个带有三角箭头的的虚线
  2. 该虚线的箭头指向其依赖的另一个类图
  3. 该虚线的线尾部指向自身


上图是一个依赖关系,车子并不是人的一部分,但人有很多行为,当中开车的行为就需要车子的参与

用 Java 代码实现上图关系:

/*** 汽车类*/
class Car {}/*** 人类*/
class Person {/*** 驾驶** @param car 人要驾驶汽车*/public void drive(Car car) {}/*** 走路*/public void walk() {}/*** 说话*/public void talk() {}
}

6. 继承关系

继承关系是指父子类,通过开发语言的关键字实现,比如 Java 中使用 extends 来实现继承关系,继承属于耦合度
很高的关联,子类会继承父类的所有非私有的属性和方法

表示继承关系需要满足三点:

  1. 拥有一个带有空心三角箭头的的实线
  2. 该实线的线尾部指向子类
  3. 该实线的箭头指向父类
  4. 子类从父类中继承的属性和方法,不需要列举在子类的类图中


上图是一个继承关系,父类 Person 中定义了公共的成员属性 name, Teacher 和 Student 的类图中虽然没有定义
name 属性,但是因为它们都继承于 Person,所以它们也都默认拥有 name 属性

用 Java 代码实现上图关系:

/*** 人类*/
class Person {/*** 名字*/public String name;
}/*** 教师类*/
class Teacher extends Person {/*** 教师编号*/public String teacherNo;
}/*** 学生类*/
class Student extends Person {/*** 学生编号*/public String studentNo;
}

7. 实现关系

实现关系是指接口和实现类,是通过开发语言的关键字完成,比如 Java 中使用 implements 来完成接口和实现类
关系,接口中定义的方法和属性,其实现类会默认拥有,如果接口中的方法没有默认方法体,则实现类必须将方法体完成

表示实现关系需要满足三点:

  1. 拥有一个带有空心三角箭头的的虚线
  2. 该虚线的线尾部指向实现类
  3. 该虚线的箭头指向接口


上图是一个实现关系,Person 和 Dog 实现了 Action 接口,那么 Person 和 Dog 就都默认拥有 run 方法,如果
接口 Action 中的 run 方法没有定义默认方法体,那么 Person 和 Dog 就必须完成 run 方法

用 Java 代码实现上图关系:

/*** 动作类*/
interface Action {/*** 跑 - 没有定义默认方法体*/public void run();
}/*** 人类 - 要实现动作接口*/
class Person implements Action {/*** 跑-完成方法体*/public void run() {}
}/*** 狗类 - 要实现动作接口*/
class Dog implements Action {/*** 跑-完成方法体*/public void run() {}
}

一、设计模式 - UML (统一建模语言) - 类图相关推荐

  1. UML(统一建模语言)类图的六大关系

    在UML类图中,类之间的关系可以分成:关联(association).聚合(aggregation).组合(composition).依赖(dependency).泛化(generalization) ...

  2. UML(Unified Modeling Language)统一建模语言--类图详解

    UML(Unified Modeling Language)统一建模语言--类图详解   2010-05-12 作者:fenglin1985 来源:fenglin1985的blog   类图是面向对象 ...

  3. 3.UML中的类图及类图之间的关系

    统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...

  4. UML统一建模语言知识体系概述

    UML统一建模语言知识体系概述 http://developer.51cto.com/  2006-01-11 16:46    noahsports.com  我要评论(3 ) UML是一种定义良好 ...

  5. 【设计模式学习笔记】类图:类与类之间的关系

    目录 一.UML统一建模语言简介 二.类图 三.类与类之间的关系 1. 泛化关系 2. 实现关系 3.  依赖关系 4. 关联关系 5. 聚合关系 6. 组合关系 四.小结 一.UML统一建模语言简介 ...

  6. 【转】[完全免费] 在线UML Class Diagram 类图工具 - 教程第1部分

    在线Visual Paradigm - UML编辑器 使用在线UML编辑器轻松绘制UML图,其中包含功能强大的UML编辑工具,即时UML语法检查和整洁的用户界面.Visual Paradigm在线UM ...

  7. C++(21)--Astah uml 画C++类图

    Astah uml 画C++类图 1.安装 2.使用 <老九学堂C++课程><老九学堂C++课程>详情请到B站搜索<老九零基础学编程C++入门> --------- ...

  8. Eclipse 插件用法:Eclipse 利用 Amateras UML 生成 Java 类图、时序图和 UML 类图

    文章目录 前言 一.安装 Eclipse 官方提供的安装框架 GEF 1.1.Eclipse 中第三方插件更新/安装策略 1.2.为什么选择 GEF 框架? 1.3.GEF 框架安装 二.安装 Ama ...

  9. [完全免费] 在线UML Class Diagram 类图工具 - 教程第1部分

    在线Visual Paradigm - UML编辑器 使用在线UML编辑器轻松绘制UML图,其中包含功能强大的UML编辑工具,即时UML语法检查和整洁的用户界面.Visual Paradigm在线UM ...

  10. eclipse中green UML 自动生成类图

    2019独角兽企业重金招聘Python工程师标准>>> eclipse中.green UML 自动生成类图 Green UML和AmaterasUML 两种 一.安装方法: 1.都是 ...

最新文章

  1. 乌托邦畅想:众筹开源城市
  2. html财务统计,财务统计.html · 珠烟/layuiadmin-templete - Gitee.com
  3. dm7和mysql_【干货分享】达梦数据库DM7的新特性发布啦
  4. 玩转springboot:默认静态资源和自定义静态资源实战
  5. 差分约束 【bzoj2330】[SCOI2011]糖果
  6. springboot通过接口访问html,springboot不通过controller直接访问静态html
  7. 7年老Android一次操蛋的面试经历,挥泪整理面经
  8. 前端学习(1036):bootstrap-js插件2
  9. 八.激光SLAM框架学习之LeGO-LOAM框架---框架介绍和运行演示
  10. 【技术角度看问题之一】ARM到底是个啥?
  11. mouseover和mouseenter的区别
  12. ARM汇编书写格式及符号(symbol)和表达式(expr)
  13. opencv threshold_OpenCV致幻
  14. Linux内核入门(一)——体系架构
  15. 使用Source Insight查看Android Framework 源码
  16. 清华大学计算机系高考选科要求,清华大学新高考选课要求-清华大学新高考选考科目...
  17. 人脸识别中的活体检测
  18. bzoj 1106: [POI2007]立方体大作战tet(贪心+树状数组)
  19. stack Overflow 的使用
  20. 以门头沟为例:FCoin的投资人有未来吗?

热门文章

  1. 中标麒麟7.0+linux内核版本,中标麒麟7.0下载
  2. 数字证书国产化的趋势
  3. 如何导出魔兽3模型到3Dmax里
  4. Xweibo插件版20110809重要补丁及下载
  5. 联想微型计算机ai0,联想baby AI
  6. C语言一个简单的贪吃蛇程序
  7. 复现贪吃蛇程序——吃食物增加长度(最后一篇)
  8. SpringBoot整合WebService实例
  9. 不同操作系统查询硬盘序列号的方法
  10. 最新最全的免费股票数据接口--沪深A股指数实时交易数据API接口(七)