UML类图符号 各种关系说明以及举例
UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。
- 依赖(Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。
- 泛化(Generalization):通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。
- 实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。
- 关联(Association):元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。
- 聚合(Aggregation):关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
- 组合(Composition):组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。
其中依赖(Dependency)的关系最弱,而关联(Association),聚合(Aggregation),组合(Composition)表示的关系依次增强。换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。
而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系,而关联描述了对象之间的结构关系。
后面的例子将针对某个具体目的来独立地展示各种关系。虽然语法无误,但这些例子可进一步精炼,在它们的有效范围内包括更多的语义。
1.1.1 依赖(Dependency):虚线箭头表示
1、依赖关系也是类与类之间的联结
2、依赖总是单向的。(#add 注意,要避免双向依赖。一般来说,不应该存在双向依赖。)
3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。
class Person { void buy(Car car) { ... } } |
虚线加箭头
1.1.2 关联(Association):实线箭头表示
1、关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
2、关联可以是双向的,也可以是单向的(#add还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
3、在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。
class 徒弟 { }; class 唐僧 { protected: list<徒弟> tdlist; }; |
1.1.3 聚合(Aggregation):带空心菱形头表示
1、聚合关系是关联关系的一种,是强的关联关系。
2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。
4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。
class 引擎 { }; class 轮胎 { }; class 汽车 { protected:引擎 engine; protected:轮胎 tyre[4]; }; |
1.1.4 合成(Composition):带实心菱形头的实线表示
1、合成关系是关联关系的一种,是比聚合关系还要强的关系。
2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
class 肢 { }; class 人 { protected: 肢 limb[4]; }; |
一般是实心菱形加实线箭头表示
一般化关系(泛化和实现):表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化关系是子类指向父类的,或从实现接口的类指向被实现的接口,与继承或实现的方向相反。如下图所示:
图:一般化关系
1.1.5 泛化(Generalization):
带空心箭头的实线线表示
泛化(图H)表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中,用extends关键字来直接表示这种关系。
泛化关系表示类与类之间的继承关系,接口与接口之间的继承关系。图H
1.1.6 实现(Realization):空心箭头和虚线表示
实例(图I)关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。
图I
相关文章:

Java项目:医院预约挂号系统(java+SpringBoot+Maven+Vue+mysql)
源码获取:博客首页 "资源" 里下载! 一、项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

《暗时间》读后感
什么是暗时间 什么是暗时间?你走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、睡觉,所有这些时间都可以称为“暗时间”。我理解暗时间就是把自己平时在不知不觉中度过的,看不到它流逝的时光充分利用起来的时间。这些时间在作者的眼里是可以…

AbstractMap详解
/ 包:java.util// 包:java.util package java . util;Map.Entry;同 SimpleEntry 一样,都继承了 Map.Entry 和 序列化接口。

OpenGL渲染流水中的处理步骤
显示列表:不管数据描述的是几何体还是像素,都可以被存储在显示列表中,供现在或以后使用;也可以不将数据存储在显示列表中,而是立刻对数据进行处理,这被称为直接模式.显示列表被执行时,其中存储的数据被发送出去,就像在应用程序中用直接模式发送一样.求值程序:所有的几何图元最终…

需要在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码
通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。public static final PrintStream err“标准”错误输出流。PrintStream 是打印输出流,它继承于FilterOutputStream。第二个用的是用的是char类型,根本不是方法,当要输出方法体的时候,会给你遍历数组。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。诡异的是,如果错了,面试官对你说了一句:你回去看看,

Linux复制文件scp
cp 复制文件(copy) cp sourcefile destfile scp 跨服务器复制(secure copy) (1) 复制文件: scp local_file remote_usernameremote_ip:remote_folder 或 scp local_file remote_usernameremote_ip:remote_file 或 scp local_file remote_ip:remote_folder 或 scp lo…

一键部署 SpringCloud 微服务,这套流程值得学习一波儿!
一键部署 springcloud 微服务,需要用到 Jenkins K8S Docker等工具。本文使用jenkins部署,流程如下图开发者将代码push到git运维人员通过jenkins部署,自动到git上pull代码通过maven构建代码将maven构建后的jar打包成docker镜像 并 push docker镜像到docker registry通过k8s发起 发布/更新 服务 操作其中 2~5步骤都会在jenkins中进行操作。
Observer Pattern 观察者模式
Observer Pattern (观察者模式) 定义: 《设计模式》中对Observer模式的意图是这样描述的:“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并且自动更新”。 The Observer Patt…

Java项目:精美风在线音乐网站(java+JDBC+C3P0+servlet+mysql+JSP)
源码获取:博客首页 "资源" 里下载! 1.运行环境 环境配置: Jdk1.8 Tomcat8.5 mysql Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术: JSP C3P0 Servlert html css JavaS…

Solution 24: 链表翻转
程序 public class ListReverse {public ListNode reverseList(ListNode head) {if (head null) {return head;}ListNode pre head;ListNode cur pre.next;pre.next null;while (cur ! null) {ListNode next cur.next;cur.next pre;pre cur;cur next;}return pre;}pu…

Android开发实践:以“专业”的态度处理多线程
刚开始学一门编程语言的时候,我总是会有一种困惑,怎样让自己的代码看起来更“专业”?很多时候,我们可以照着教材实现一些基本的功能,比如用Socket发送/接收几个字符,写一个线程完成某个异步任务,…

js 正则匹配URL,网址,带端口,带query的
function isURL(url) {const strRegex ^((https|http|ftp)://)?//(https或http或ftp):// 可有可无 (([\\w_!~*\()\\.&$%-]: )?[\\w_!~*\()\\.&$%-])? //ftp的user 可有可无 (([0-9]{1,3}\\.){3}[0-9]{1,3} // IP形式的URL- 3位数字.3位数字.3位数字.3位数字 | // 允…

接入层的流程和非接入层
所谓接入层的流程和非接入层的流程,实际是从协议栈的角度出发的。在协议栈中,RRC和RANAP层及其以下的协议层称为接入层,它们之上的MM、SM、CC、SMS 等称为非接入层。简单地说,接入层的流程,也就是指无线接入层的设备RN…

Java项目:精美网上音乐平台(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 音乐播放 用户登录注册 用户信息编辑、头像修改 歌曲、歌单搜索 歌单打分 歌单、歌曲评论 歌单列表、歌手列表分页显示 歌词同步显不 音乐收藏、下载、拖动控制、…

UICollectionView的使用方法
1、遵守协议 <UICollectionViewDataSource,UICollectionViewDelegateFlowLayout> 2、创建 UICollectionViewFlowLayout * layout [[UICollectionViewFlowLayout alloc]init]; layout.minimumInteritemSpacing 10; //最小item之间的间距 layout.minimumLineSpaci…

python学习--服务期间通讯和mysql数据库操作
服务端import socket import json ssocket.socket(socket.AF_INET,socket.SOCK_STREAM,0) host port1234 s.bind((host,port)) s.listen(3) while True:client,ipaddrs.accept()print "Got a connect from %s" %str(ipaddr)dataclient.recv(1024)metadatajson.loads(…

[Angular JS教程] HeroService: getHeroes failed: undefined 问题解决方法
最近在学习入门Angular JS,学习资源是https://angular.cn/tutorial, 在学习到 “https://angular.cn/tutorial/toh-pt6模拟数据服务器” 阶段时,客户端访问http://localhost:4200/无法get到英雄列表,Message系统记录日志如下&…

BZOJ 4059: [Cerc2012]Non-boring sequences ( )
要快速在一段子序列中判断一个元素是否只出现一次 , 我们可以预处理出每个元素左边和右边最近的相同元素的位置 , 这样就可以 O( 1 ) 判断.考虑一段序列 [ l , r ] , 假如我们找到了序列中唯一元素的位置 p , 那我们只需检查 [ l , p - 1 ] & [ p 1 , r ] 是否 non-boring…

Java项目:小蜜蜂扩音器网上商城系统(java+JSP+Servlet+JDBC+Ajax+mysql)
源码获取:博客首页 "资源" 里下载! 一、项目简述 用户功能模块: 用户注册: 用户登录:商品模块:订单模块;后台管理系统功能:管理员模块: 商品模块:…

WebBrowserProgramming - Python Wiki
WebBrowserProgramming - Python WikiWeb Browser Programming in Python

C++ transform for_each
#include<iostream>#include<vector>#include <list>#include <algorithm>#include <functional> using namespace std; //不需拷贝,速度快void square(int &elementParam){ elementParam elementParam*elementParam;} //速度…

When should static_cast, dynamic_cast and reinterpret_cast be used?
这是我偶然在 http://stackoverflow.com/questions/ 网页上发现的一个问题(类似博客园的博问),问题主要是关于询问应该怎样使用,以及何时使用C里面的这几种类型转换操作符:static_case, dynamic_cast,以及 …

Java项目:养老院管理系统(java+SSM+JSP+Easyui+maven+mysql)
源码获取:博客首页 "资源" 里下载! 运行环境: JDK1.8、tomcat8、eclipse、mysql5.6、Navicat 功能实现: 用户: 用户名,登录密码,姓名,性别,出生日期,用户照片,联系电话,邮箱,家庭地址,注册时间 老人: 老人编号,姓名,…

Linux访问Windows磁盘实现共享
业务需求说明:公司在部署hadoop集群和DB server与SAN存储,公司的想法是前端通过DB Server能够将非结构化的数据能放进SAN存储当中,而hadoop集群也能够访问这个SAN存储。因此需要在SAN磁盘阵列中开辟一个共享区域,这个区域技能让DB…

ubuntu环境ceph配置入门(一)
为什么80%的码农都做不了架构师?>>> 环境:ubuntu server 14.04 64bit,安装ceph版本0.79 正常情况下应有多个主机,这里为了快速入门以一台主机为例,多台主机配置方式类似。 1. 配置静态IP及主机名 静态IP配…

mysql查看当前实时连接数
静态查看: SHOW PROCESSLIST; SHOW FULL PROCESSLIST; SHOW VARIABLES LIKE %max_connections%; SHOW STATUS LIKE %Connection%; 实时查看: mysql> show status like Threads%; -------------------------- | Variable_name | Value | ------------…

lsof 简介
lsof简介 lsof(listopen files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协…

Java项目:健身器材商城系统(java+Jdbc+Servlet+Ajax+Fileupload+mysql)
源码获取:博客首页 "资源" 里下载! 一、项目运行 环境配置: Jdk1.8 Tomcat8.5 mysql Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术: Jdbc Servlert html css JavaScrip…

Xcode中如何解决无法使用svn命令行的问题
今天在自己机器上安装了xp虚拟机,然后在xp虚拟机上安装了svn的服务器.发现原本Xcode5以后就自带的svn竟然在终端无法使用命令行,出现了以下的错误: xcrun: error: active developer path ("/Volumes/Xcode/Xcode.app/Contents/Developer") does not exist, use xcode…

查看和设置MySQL数据库字符集(转)
查看和设置MySQL数据库字符集作者:scorpio 2008-01-21 10:05:17 标签: 杂谈 Liunx下修改MySQL字符集:1.查找MySQL的cnf文件的位置find / -iname *.cnf -print /usr/share/mysql/my-innodb-heavy-4G.cnf/usr/share/mysql/my-large.cnf/usr/sha…