设计模式学习---UML常见关系的实现
一、UML基本构造 |
UML的基本构造含3种:
(1) 事物(4种):结构事物,行为事物,分组事物,注释事物
(2) 关系(4种):泛化关系,实现关系,依赖关系,关联关系
(3) 图(10种):用例图,类图,对象图,包图,组件图,部署图,状态图,活动图,序列图,协作图
事物是对模型中最具代表性的成分的抽象;关系把事物结合在一起;图聚集了相关的事物。
二、UML中关系 |
UML 中关系描述的是:类与类, 类与接口, 接口与接口之间的关系。UML中的关系主要包括: 泛化(generalization) 关系, 关联(association)关系( 关联, 聚合, 组合), 依赖(dependency)关系,实现(realization)关系。其中,关联和依赖关系是按类之类关系的紧密的程度而划分的,它们之间的关系强度:
依赖 <<< 关联 <<< 聚合 <<< 组合
泛化关系
泛化关系是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系
在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性
实现关系
实现关系指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系
在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性
依赖关系
依赖关系: 也是类与类之间的连接;表示一个类依赖于另一个类的定义; 依赖关系总是单向的 。可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。现实世界层面表现为:比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;代码层面表现为:类B作为参数被类A在某个method方法中使用
在Java 中依赖关系体现为: 局部变量,方法中的参数,和对静态方法的调用。如下面的例子:Driver类依赖于Car类,Driver的三个方法分别演示了依赖关系的三种不同形式
class Car {
public
static
void run(){System.out.println(汽车在奔跑);
}
}
class Driver {
//使用形参方式发生依赖关系
public
void drive1(Car car){car.run();
}
//使用局部变量发生依赖关系
public
void drive2(){Car car =
new Car();car.run();
}
//使用静态方法发生依赖关系
public
void drive3(){Car.run();
}
}
关联关系
关联关系: 表示类与类之间的联接, 它使一个类知道另一个类的属性和方法 。关联可以使用单箭头表示单向关联, 使用双箭头或不使用箭头表示双向关联, 不建议使用双向关联;关联有两个端点, 在每个端点可以有一个基数, 表示这个关联的类可以有几个实例。常见的基数及含义如下
0..1:
0 或1 个实例
0..*:
对实例的数目没有限制
1 : 只能有一个实例
1..*: 至少有一个实例
关联体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。代码层面表现为:被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量
在java 中关联关系是使用实例变量实现的,依然使用如下:Driver和Car的例子,使用方法参数形式可以表示依赖关系,也可以表示关联关系。在本例中,使用成员变量表达这个意思:车是我自己的车,我"拥有"这个车。使用方法参数表达:车不是我的,我只是个司机,别人给我什么车我就开什么车,我使用这个车。
class Driver {
//使用成员变量形式实现关联
Car mycar;
public
void drive(){mycar.run();
}
...
//使用方法参数形式实现关联
public
void drive(Car car){car.run();
}
}
聚合关系
聚合关系: 关联关系的一种特例,是强的关联关系。聚合是整体和个体之间的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。现实层面表现为:比如计算机与CPU、公司与员工的关系等;代码层面表现为:和关联关系是一致的,只能从语义级别来区分
在java 中聚合关系也是使用实例变量实现的,从java 语法上是分不出关联和聚合的,关联和聚合的区别纯粹是概念上的,而且严格反映在语义上。聚合在代码中的实现是比较灵活的,大雁聚合为雁群,只要大雁类是雁群的成员变量就行了,代码有两种方式都是聚合:
第一种方式:通过传参方式
这种方式一般用在大雁WideGoose是抽象类(父类)的时候,这时候,就可以传入不同的子类,这样就会使它调用的时候很灵活
class WirdGooseAggregate{
private WideGoose widegoose;
//成员变量定义大雁public SetWideGoose (WideGoose w){
//通过传参得到大雁的对象this.widegoose = w;
}
}
第二种方式:通过设置初始值
这种方式就是写死了,是不能灵活的,但是这样写也有它的好处,就是定义了一个初始值。在状态模式中就用到了这种方式,其实是定义了一个初始对象。
class WirdGooseAggregate{
private WideGoose widegoose;
//成员变量定义大雁public SetWideGoose (){
//通过传参得到大雁的对象widegoose =
new WideBlackGoose();
//WideBlackGoose是WideGoose的子类}
}
主要注意的是:关联关系中两个类是处于相同的层次, 而聚合关系中两不类是处于不平等的层次, 一个表示整体, 一个表示部分。同时,由上图可知聚合关系一般使用setter方法给成员变量赋值
组合关系
组合关系: 也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,并且合成关系不能共享;现实层面表示为:比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。需要注意的是:组合跟聚合几乎相同,唯一的区别就是"部分"不能脱离"整体"单独存在,就是说, "部分"的生命期不能比"整体"还要长。
在java 中组合关系也是使用实例变量实现的,在代码中组合关系就没有这样灵活了,它是强耦合的,它生命周期是同生同死的关系。我们知道一个对象被实例的时候就是我们意义上的"生",因此我们就把组合的对象放在被组合对象的构造函数中:
class Person{
private Brain brain;
//成员变量定义大脑public Bird (){
//构造函数中实例化翅膀对象brain =
new Brain();}
}
由上述可知,组合关系是在构造函数中实现的
三、总结 |
对于继承、实现这两种关系没多少疑问,它们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。它们之间的联系如下:
相同点:
组合与聚合都是整体与部分的关系,组合的关系更强一点,对组合关系来说,如果失去部分,整体也将不存在了
不同点:
代码实现层面上来看: 组合:在整体的构造器中实例化部分,这个部分不能被其他实例共享。整体与部分的生命周期是同步的。而聚合关系的部分,可以在构造器中通过参数传递的形式进行初始化
从数据库的层面上看: 组合关系需要级联删除,而聚合关系不需要
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【Sunddenly】。本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
设计模式学习---UML常见关系的实现的更多相关文章
- 设计模式之UML类图的常见关系
设计模式之UML类图的常见关系 本文来自转载 烧点饭博客 本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association), ...
- 设计模式学习起点 UML类图笔记
UML类图笔记 大学开设的软件设计课程一般都会学习UML类图,大部分关于设计模式的描述都是使用的UML类图,可以说类图的表示是学习设计模式的起点.UML定义类之间的关系主要有六种:泛化关系.实现关系. ...
- UML类图的常见关系1
设计模式之UML类图的常见关系(一) 本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association),聚合(Aggre ...
- UML类图常见关系总结
Unified Modeling Language (UML)又称统一建模语言或标准建模语言. 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realizat ...
- 设计模式学习总结(一)——设计原则与UML统一建模语言
一.概要 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计 ...
- 【设计模式】UML类图及Java的类之间的关系
UML类图展示 设计模式中的对象关系 关联和依赖的对比 依赖关系 虚线箭头 依赖是a类成员方法中有b类的属性,动物新陈代谢方法中有水和空气的属性,只有调这个方法的时候,才可能临时用一下 关联关系 实线 ...
- 【建模】UML类关系分析
一.UML类关系分析 1.关联(asociation) 一般是一方拥有另一方对象的指针.箭头的方向是访问方向. 2.聚合(Aggregation)和组合(Composition) 聚合和关联一般不做区 ...
- 设计模式学习--Factory Method
What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
随机推荐
- Python笔记(十三):urllib模块
(一) URL地址 URL地址组件 URL组件 说明 scheme 网络协议或下载方案 net_loc 服务器所在地(也许含有用户信息) path 使用(/)分割的文件或CGI应用的路径 p ...
- WebSocket实现web即时通信(后端nodejs实现)
WebSocket实现web即时通信 一.首先看一下,HTTP.ajax轮询.long poll和WebSocket的区别: 1.HTTP 协议(短连接):一个 Request 一个 Response ...
- innodb 表锁和行锁
表锁 表锁相关结构: table->locks:数据字典table保存这个表上的所有表锁信息 trx->lock.table_locks:每个事务trx保存该事务所加的所有表锁信息 tr ...
- python类的内置方法
1,__init__(self) 初始化方法,实例化一个对象的时候就会被执行 2,__call__(self,*args) 把实例对象作为函数调用,即实例化一个对象后,在对象后面加括号即可调用__ca ...
- Oracle EBS 贷项通知单核销
SELECT cm.trx_number ,fnd_flex_ext.get_segs('SQLGL', 'GL#', gcc.chart_of_accounts_id, ad.code_combin ...
- VUE中v-on:click事件中获取当前dom元素
在开发中总是忘记, 特意在此记录 关键字: $event <div class="bed" v-on:click="updateBed(index,$e ...
- python基础学习4----元组
元组又叫只读列表,不可以修改其内容 1.创建元组 tuple1=(1,3,2,4,5) tuple2=()#空元组 tuple3=('a',) #元组中只有一个元素时要在元素后面加上逗号,否则会被当成 ...
- [IDEA_3] IDEA 配置 GitHub 并上传项目
0. 说明 参考 Git & GitHub 的安装配置 IDEA 配置 GitHub 并上传项目 1. 安装配置 Git & GitHub 参照 Git & GitHub 的安 ...
- VMware 导出镜像文件供 Virtual Box 使用
1. 问题描述 Windows 系统安装的 VMware 里的安装配置好的虚拟机需要拷贝到 MAC 的 Virtual Box 中. 需要将 VMware 中的虚拟机导出为镜像文件供 Virtual ...
- Markdown 进阶
目录 markdown进阶语法 内容目录 加强代码块 脚注 流程图 时序图 LaTeX公式 markdown进阶语法 内容目录 使用 [TOC] 引用目录,将 [TOC] 放至文本的首行,编辑器将自动 ...