-undo
继承、实现、依赖、关联、聚合、组合的联系与区别
分别介绍这几种关系:
继承
指的是一个类(称为子类、子接
口)继承另外的一个类(称为父类、父接口)的功能,并可
以增加它自己的新功能的能力
,继承是类与类或者接口与接口之间最常见的关系;在
Java
中此类关系通过关键字
extends
明确标识,在设计时一般
没有争议性;
实现
指的是一个
class
类实现
interface
接口(可以是多个)的功能;实现是类与接口之间最常
见的关系;在
Java
中此类关系通过关键字
implements
明确标识,在设计时一般没有争
议性;
依赖
可以
简单的理解,
就是一个类
A
使用到了另
一个类
B
,
而这种使用关系是具有偶然
性的、
、
临时性的、非常弱的,但是
B
类的变化会影响到
A
;比如某人要过河
,需要借用一条船,
此时人与船之间的关系就是依赖;
表现在代
码层面,
为类
B
作为参数被类
A
在某个
method
方法中使用;
关联
他体现的是两个类、
或者类与接口之间语义级别的一种强依赖关系,
比如我和我的朋友;
这
种关系比依赖更强、
不存在依赖关系的偶然
性、关系也不是临时性的,
一般是长期性的,而
且双方的关系一
般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类
B
以类属性的形式出现在关联类
A
中,也可能是关联类<
/p>
A
引用了一个类型为被关联类
B
的全
局变量;
聚合
聚合是关联关系的一种特例,他
体现的是整体与部分、拥有的关系,即
has-a
的关系,此<
/p>
时整体与部分之间是可分离的,
他们可以具有各自的生命周期,<
/p>
部分可以属于多个整体对象,
也可以为多个整体对象共享;
比如计算机与
CPU
、
公司与员工的关系等;
表现在代码层面,
和关联关系是一致的
,只能从语义级别来区分;
组合
组合也是关联关系的一种特例,
他体现的是一种
contains-a
的关系,
这种关系比聚合更强,
也称为强聚合;
他同样体现整体与部分间的关系,
但此时整体与部分是不可分的,
整体的生
命周期结束也就意味着部分的生命周期结束;
比如你和你的大脑;
表现在代码层面,
和关联
关系是一致的,只能从语义级别来区分;
对于继承、
实现这两种关系没多少疑问,
他们
体现的是一种类与类、
或者类与接口间的纵向
关系;
其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区
分的,
有很多事物间的关系要想准备定位是很难的,
前
面也提到,
这几种关系都是语义级别
的,所以从代码层面并不能
完全区分各种关系;
但总的来说,后几种关系所表现的强弱程
度依次为:
组合
>
聚合
>
关联
>
依赖;
聚合跟组合其实都属于关联只不过它们是两种特殊的关联因为本是同根生所
以它们之间难
免会有相似之处下面让我们一起来看一下它们之间有何不同
聚合与组合的概念相信不用我在此赘述大家就已经了解了下面直接上例子
p>
程老师的
《大话》
里举大那个大雁的例子很贴切在此我就借用一下大雁喜欢热闹害怕孤独所
以它们一直过
着群居的生活这样就有了雁群每一只大雁都有自己的雁群每个雁群都有好多
大雁大雁与雁
群的这种关系就可以称之为聚合另外每只大雁都有两只翅膀大雁与雁翅的关
系就叫做组合
有此可见聚合的关系明显没有组合紧密大雁不会因为它们的群主将雁群解散
而无法生存而
雁翅就无法脱离大雁而单独生存
——
组合关系的类具有相同的生
命周期
聚合关系图:
组合关系图:
从从代码上看这两种关系的区别在于:
构造函数不同
雁群类:
[csharp]
view
plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
public
class
GooseGroup
{
public
Goose goose;
public
GooseGroup(Goose
goose)
{
this
.goose = goose;
}
10.
}
[csharp]
view plaincopy
1.
public class
GooseGroup
2.
{
3.
public Goose goose;
4.
5.
6.
public
GooseGroup(Goose goose)
7.
{
8.
= goose;
9.
}
10.
}
大雁类:
[csharp]
view
plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
public
class
Goose
{
public
Wings wings;
public
Goose()
{
wings=
new
Wings();
}
}
[csharp]
view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class
Goose
{
public Wings
wings;
public Goose()
{
wings=new Wings();
}
}
聚合关系的类里含有另一个类作为参数
雁群类(
GooseGroup
)的构造函数中要用到大雁
(
Goose
)作为参数把值传进来大雁类
(
Goose
)可以脱离雁群类而独立存在
组合关系的类里含有另一个类的实例化
p>
大雁类(
Goose
)在实例化之前一定要
先实例化翅膀类(
Wings
)两个类紧密耦合在一起
它们有相同的生命周期翅膀类(
Wings
)不
可以脱离大雁类(
Goose
)而独立存在
信息的封装性不同
在聚合
关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的
而在组合关系中,
客户端只认识大雁类,
根本就不知道
翅膀类的存在,
因为翅膀类被严密的
封装在大雁类中。
-------------------------------
--------------------------------------------------
------
----------------
UML-<
/p>
泛化、关联、聚合、组合、依赖
一、泛
化关系(
generalization
)
1.
说明
表示类与类之间的继承关系,
接口与接口之间的继承关系,
或类对接口的实现关系。
一般化
的关系是从子类指向父类的,与
继承或实现的方法相反。
2.
例图
3.
表现
父类父类实例=
new
子类
();
4.
举例
class Animal{};
class Tigger
: public Animal{};
class Dog : public
Animal{};
Animal* pAnimal = new Dog;
p>
二、关联关系(
association
)
1.
说明
对于两个相对独立的对象,
当一个对象的实例与另一个对象的一
些特定实例存在固定的对应
关系时,这两个对象之间为关联关系。
表示类与类之间的联接,
有双向关联和单向关联,
双向关联有两个箭头或者没有箭头,
单向
关联有
一个箭头,表示关联的方向。
关联关系以实例变量的形式存在
,在每一个关联的端点,
还可以有一个基数
(multipli
city),
表明这一端点的类可以有几个实例。
2.
例图
3.
表现
双
向关联在代码的表现为双方都拥有对方的一个指针,当然也可以是引用或者是值。
关联关系是使用实例变量来实现。
4.
举例
//eg.1
//
单向关联
class Person{};
class Friend
{
Person* mpPerson;
};
//eg.2
//
双向关联
class A;
class B
{
A* pA;
};
class A
{
B* pB;
};
//eg.3
//
自身关联
class C
{
C* pC;
};
三、聚合关系(
aggrega
tion
)
1.
说明:
关联关系的一种,
是强的关联关系。
聚合是整体和个体的关系。
聚合关系也是通过实例变量
实现的。例如汽车、发动机、轮胎,
一个汽车对象由一个发动机对象,四个轮胎对象组成。
当类之
间有整体
-
部分关系的时候,我们就可以使用组合或者聚合。<
/p>
2.
例图
3.
表现
与
关联关系一样,
聚合关系也是通过实例变量来实现这样关系的。
关联关系和聚合关系来语
法上是没办法区分的,从语义上才能更好的区分两者的区别。<
/p>
4.
举例
class CPU{};
class Memory{};
class Computer
{
CPU* mpCPU;
Memory*
mpMemory;
};
四、组合关系(合成关系)(
p>
composition
)
1.
说明:
合成关系也是关联关系的一种,
是比聚合关系更强的关系。
合成
关系是不能共享的。
例如人
有四肢、头等。
表示类之间整体和部分的关系,
组合关系中部分和整体具
有统一的生存期。
一旦整体对象不
存在,部分对象也将不存在。
部分对象与整体对象之间具有共生死的关系。
2.
例图
3.
表现
4.
举例
//
同聚合关系,不过说语义不同
class Leg{};
class Arm{};
class Person
{
Leg mLeg;
Arm mArm;
};
五、依赖关系(
Depende
ncy
)
1.
说明:
对于两个相对独立的对象,
当一个对象负责构造另一个对象的实例,
或者依赖另一个对象的
服务时,这两个对象之间主要体现为依赖关系。
与关联关系不同的是,
依赖关系是以参数变量的形
式传入到依赖类中的,
依赖是单向的,
要
避免双向依赖。一般来说,不应该存在双向依赖。
依赖是一
种弱关联,
只要一个类用到另一个类,
但是和另一个类的关系不
是太明显的时候
(可
以说是
“uses
”
了那个类),就可以把这种关系看成是依赖。
2.
例图
3.
表现
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
4.
举例
class Car{};
class House{};
class Person
{
void buy(Car& car){}
void
buy(House* pHouse){}
};
六、关系之间的区别
1.
聚合与组合
(
1
)聚合与组合都是一种结合关系,只是额外具有整体<
/p>
-
部分的意涵。
(
2
)部件的生命周期不同
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多
p>
个整件可以共享同一个部件。
组合关系
中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多
个整件
不可以同时间共享同一个部件。
(
3
)聚合关系是
“has
-
a”
关系,组合关系是
“contains
-
a”
关系。
2.
关联和聚合
(
1
)表现在代码层面,和关联关系是一致的,只能从语义
级别来区分。
(
2
< br>)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的
朋友,聚合则一般不是平等的。
(
3
)关联是一种结构化的关系,指一种对象和另一种对象有联系。
(
4
)关联和聚合是视问题域而
定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车
类中的,
因为它离开了汽车就没有意义了。
但是在卖轮胎的店铺业务里,
就算轮胎离开了汽
车,它也是有意义的,这就可以用聚合了。
3.
关联和依赖
(
1
)关联关系中,体现的是两个类、或者类与接口之
间语义级别的一种强依赖关系,比如
我和我的朋友;
这种关系比
依赖更强、不存在依赖关系的偶然性、
关系也不是临时性的,一
般是长期性的,而且双方的关系一般是平等的。
(
2
)依赖关系中,可以简单的理解,就是一个类
A
使用到了另一个类
B
,而这种使用关系
是具有偶然性的、临时性的、非常弱的,但是
B
类的变化会影响到
A
。
4.
综合比较
这几种关系都是语义级别的,
所以从代码层面并不能完全区分各种关系;
但总的来说,
后几
种关系所表现的强弱程度依次为:
组合
>
聚合
>
关联
>
依赖
;
--------------------------
--------------------------------------------------
-----------
----------------------------
----------------------------
UML
线条箭头
关系
后面的例子将针对某个具体目的
来独立地展示各种关系。
虽然语法无误,
但这些例子可进一
p>
步精炼,在它们的有效范围内包括更多的语义。
< br>依赖(
Dependency
)
实体之间一个
“
使用
< br>”
关系暗示一个实体的规范发生变化后,可能影响依赖于它的其他实例
(
图
D
)。更具体地说,
它可转换为对不在实例作用域内的一个类或对象的任何类型的引
用。其中包括一个局部变
量,对通过方法调用而获得的一个对象的引用(如下例所示),或
者对一个类的静态方法
的引用
(同时不存在那个类的一个实例)
。
也可利用
“
依赖
”
来表示包
和包之间的关系。
由于包中含有类,
所以你可根据那些包中的各个类之间的关系,
表示出包
< br>和包的关系。
图
D
关联(
Association
p>
)
实体之间的一个结构化关系表明对象是
相互连接的。箭头是可选的,它用于指定导航能力。
如果没有箭头,暗示是一种双向的导
航能力。在
Java
中,关联(
图
p>
E
)转换为一个实例作
用域的变量,就像图
E
的
“Java”
区域所展示的代码那样。可为一个关联附加其他修饰符。
多重性(
< br>Multiplicity
)修饰符暗示着实例之间的关系。在示范代码中,
p>
Employee
可以有
0
个或更多的
TimeCard
对象。但是,每个
TimeCard
只从属于单独一个
Employee
。
图
E
聚合(
Aggregation
)
p>
聚合(
图
F
p>
)是关联的一种形式,代表两个类之间的整体
/
局部关系。聚合暗示着整体在概
念上处于比局部更高的一个级别,
< br>而关联暗示两个类在概念上位于相同的级别。
聚合也转换
成
Java
中的一个实例作用域变量。
关联和聚合的区别纯粹是概念上的,
而且严格反映在语义上。<
/p>
聚合还暗示着实例图中不存在
回路。换言之,只能是一种单向关系
。
图
F
合成(
Composition<
/p>
)
合成(
图<
/p>
G
)是聚合的一种特殊形式,暗示
“
p>
局部
”
在
“
整体
”
内部的生存期职责。合成也是非
共享的。
所以,
虽然局部不一定要随整体的销
毁而被销毁,
但整体要么负责保持局部的存活
状态,
要么负责将其销毁。局部不可与其他整体共享。但是,
整体可将所有权转交
给另一个
对象,后者随即将承担生存期职责。
Employee
和
TimeCard
的关系或许更适合表示成
“
合成
”
,而不是表示成
“
关联
”
。
图
G
-undo
-undo
-undo
-undo
-undo
-undo
-undo
-undo
-
上一篇:《圣经》经典语录(中英309句)
下一篇:分类记单词-名词大全