UML类图五种关系与代码的对应关系
转:
UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承
一、依赖关系:
(一)说明
虚线+箭头
可描述为:Uses a
依赖是类的五种关系中耦合最小的一种关系。
因为在生成代码的时候,这两个关系类都不会增加属性。
(二)依赖关系图与代码的对应关系
(PS:依赖关系:Animal依赖于Water(动物依赖于水))
- Public class Animal()
- {
- Public Animal(){}
- }
- Public class Water()
- {
- public Water(){}
- }
可以看到生成的两个类的代码中什么都没有添加。
(三)思考:
Animal类如何使用Water类呢?或者说依赖关系到底是如何体现的呢?
1、表现形式1
Water类是全局的,则Animal类可以调用它
2、表现形式2
Water类是 Animal类的某个方法中的变量,则Animal类可以调用它。
- Public class Animal {
- Public void Grownup() {
- Water water =null;
- }
- }
注意1: Water类的生命期,它是当Animal类的GrounUp方法被调用的时候,才被实例化。
注意2:持有Water类的是Animal的一个方法而不是Animal类,这点是最重要的!
3、表现形式3
Water类是作为Animal类中某个方法的参数或者返回值
- Public Animal {
- Public Water Grownup(Waterwater) {
- return null;
- }
- }
注意: Water类被Animal类的一个方法持有。生命期随着方法的执行结束而结束。
二、关联关系
(一)说明
实线+箭头
可描述为:Has a
关联关系用实线,表示类之间的耦合度比依赖强
在生成代码的时候,关联关系的类会增加属性。
(二)关联关系与代码的对应关系
PS:Water类与Climate类关联(水与气候关联)。
- Public classWater {
- public Climate m_Climate;
- public Water(){}
- }
- Public class Climate {
- public Climate() {}
- }
可见生成的代码中,Water类的属性中增加了Climate类。
(三)关联关系的种类
关联既有单向关联又有双向关联。
1、单向关联: Water类和Climate类单向关联(如下图),则Water类称为源类,Climate类称为目标类。源类了解目标类的所有的属性和方法,但目标类并不了解源类的信息。
2、双向关联:源类和目标类相互了解彼此的信息。如将Water类和Climate类之间改为双向关联。
- Public class Water {
- public Climate m_Climate;
- public Water(){}
- }
- Public class Climate {
- public Water m_Water;
- public Climate() {}
- }
可见生成的代码中,两个类的属性都添加了!
(四)思考:
依赖关系和关联关系的区别在哪里?
1、从类的属性是否增加的角度看
(1)发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。
(2)发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。
2、从关系的生命期角度看:
(1)依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。
(2)关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。
(五)关联关系的细化:聚合、组合
1、说明
(1)聚合关系,用空心菱形加箭头表示
(2)组合关系,用实心菱形加箭头表示,类之间的耦合关系比聚合强!
2、聚合和组合都是关联关系的一种,到底如何区分二者呢?
(1)聚合和组合生成的代码
(PS:此图表明雁群类是由大雁类聚合而成)
- Public classGooseGroup {
- public Goose goose;
- Public GooseGroup(Goose goose) {
- this.goose = goose;
- }
- }
(PS:此图表明大雁类是由翅膀类组合而成)
- Public classGoose {
- public Wings wings;
- public Goose() {
- wings = new Wings();
- }
- }
(2)构造函数不同
聚合类的构造函数中包含了另一个类作为参数。 雁群类(GooseGroup)的构 造函数中要用到大雁(Goose)作为参数传递进来。大雁类(Goose)可以脱离雁群类而独立存在。
组合类的构造函数中包含了另一个类的实例化。 表明大雁类在实例化之前,一定要先实例化翅膀类(Wings),这两个类紧密的耦合在一起,同生共灭。翅膀类(Wings)是不可以脱离大雁类(Goose)而独立存在。
(3)信息的封装性不同。
在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的。
在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。
三、泛化
(一)说明
实线+箭头
可描述为:Is a
泛化也称继承,子类将继承父类的所有属性和方法,并且可以根据需要对父类进行拓展。
(二)泛化关系与代码的对应关系
(PS:Bird类继承Animal类,鸟是一种动物)
- Class Bird :Animal{
- }
(三)思考:
1、子类继承父类,真的是继承了父类的所有属性和方法吗?
子类确实是继承了父类的所有属性和方法,只是对于父类的私有类型成员没有访问权限!访问就会报错!
2、泛化和继承是一回事儿吗?
子类继承父类,父类泛化子类。 这两个词是从不同的角度来说的!
3、为什么要多用组合少用继承?
继承和组合各 有优缺点。
类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。
对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。由于组合要求对象具有良好定义的接口,而且,对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来替代另一个对象;更进一步,因为对象的实现是基于接口写的,所以实现上存在较少的依赖关系。
四、实现关系
虚线+箭头
(PS:WideGoose类实现IFly接口。大雁实现飞翔的接口)
- Class WideGoose:Ifly{
- }
实现关系重点理解接口的定义
接口(interface),接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
UML类图五种关系与代码的对应关系的更多相关文章
- 转 UML类图几种关系的总结
UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregati ...
- UML类图几种关系的总结(网摘)
Source link:http://www.open-open.com/lib/view/open1328059700311.html UML类图几种关系的总结 原文出处:[深度开源] 在UML类图 ...
- 【转载】UML类图几种关系的总结
因为有的时候很久不弄UML图,老是忘记几个常见的连接线的意思,这篇完全说转载:UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Real ...
- UML类图几种关系的总结
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...
- 【转】UML类图几种关系的总结
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...
- UML类图几种关系的总结(转)
原文:http://gjhappyyy.iteye.com/blog/1422515 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization), ...
- 转:UML类图几种关系的总结
转自:http://www.open-open.com/lib/view/open1328059700311.html 在UML类图中,常见的有以下几种关系: 泛化(Generalization), ...
- UML类图几种关系的总结,泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Compositi ...
- UML类图几种关系的总结[转]
原文地址:http://www.open-open.com/lib/view/open1328059700311.html 在UML类图中,常见的有以下几种关系: 泛化(Generalization) ...
随机推荐
- iOS开发——源代码管理——SVN
一.源代码管理(svn)简介 01. 源代码管理工具概述 ======================================================================= ...
- BZOJ4517——[Sdoi2016]排列计数
求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可 ...
- 搞明白这八个问题,Linux系统就好学多了
导读 正在犹豫入坑Linux学习的同学或者已经入坑的同学,经常会问到这样八个问题.今天,这些问题我都会一一解答,希望我的看法能帮助各位同学.常言道“好的开始是成功的一半”,如果你明白了以下八个问题,就 ...
- python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html
前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...
- linux各文件夹的作用
文章转载自:http://www.cnblogs.com/amboyna/archive/2008/02/16/1070474.html 精------------------------------ ...
- PYTHON 购物车程序
product_list = [ ('iphone',50000), ('Mac Pro',9900), ('Bike',8000), ('Watch',160000), ('Coffee',600) ...
- ADB连不上,ADB server didn't ACK问题,的解决
adb连接不上虚拟机,即便执行了adb kill-server命令也没用? 如果你的错误信息是,ADB server didn't ACK这样的话,说明5037端口被占用了. 只要找出占用此端口的进程 ...
- Linux下ffmpeg的各种编解码器的安装
首先要安装各种解码器 1.lame tar -zxvf lame- cd lame- ./configure --enable-shared make make install 2.libogg ...
- Python 命名空间
通俗的来说,Python中所谓的命名空间可以理解为一个容器.在这个容器中可以装许多标识符.不同容器中的同名的标识符是不会相互冲突的.理解python的命名空间需要掌握三条规则: 第一,赋值(包括显式赋 ...
- Python 正则表达式:只要整数和小数
要求用户只能输入数字(包括整数和小数),如何用正则表达式验证用户输入? 有两种思路: 1. 给出正确格式的正则表达式,然后看输入是否合法. 2. 列出所有错误的输入,看输入是否非法. 对于思路1,想想 ...