转自:http://blog.csdn.net/weiqubo/article/details/5291871
二 :关联是一种强依赖
三 :
四 :
五 :
(1)泛化(Generalization) :狗与动物 (空箭头)
(2)关联(Association) :公司与员工有特定的某种关系 (实线)
(3)依赖(Dependency) :人依赖螺丝刀 (虚线箭头)
(4)聚合(Aggregation) : 电脑和CPU,主板 (菱形空间头)
转自:http://www.phpdoor.com/ComputerBased/OOP/1168.html
继承、实现、依赖、关联、聚合、组合的联系与区别
分别介绍这几种关系:
继承
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;
实现
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;
依赖
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;
关联
他 体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般 是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用 了一个类型为被关联类B的全局变量;
聚合
聚 合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以 属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
组合
组 合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与 部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
对 于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关 系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;
但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;
聚合跟组合其实都属于关联 只不过它们是两种特殊的关联 因为本是同根生 所以它们之间难免会有相似之处 下面让我们一起来看一下它们之间有何不同
聚合与组合的概念相信不用我在此赘述大家就已经了解了 下面直接上例子
程 老师的《大话》里举大那个大雁的例子很贴切 在此我就借用一下 大雁喜欢热闹害怕孤独 所以它们一直过着群居的生活 这样就有了雁群 每一只大雁都有自己的雁群 每个雁群都有好多大雁 大雁与雁群的这种关系就可以称之为聚合 另外每只大雁都有两只翅膀 大雁与雁翅的关系就叫做组合 有此可见 聚合的关系明显没有组合紧密 大雁不会因为它们的群主将雁群解散而无法生存 而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期
聚合关系图:
组合关系图:
从从代码上看这两种关系的区别在于:
构造函数不同
雁群类:
-
public class GooseGroup
-
{
-
public Goose goose;
-
-
-
public GooseGroup(Goose goose)
-
{
-
this.goose = goose;
-
}
-
}
大雁类:
-
public class Goose
-
{
-
public Wings wings;
-
-
public Goose()
-
{
-
wings=new Wings();
-
}
-
}
聚合关系的类里含有另一个类作为参数
雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来 大雁类(Goose)可以脱离雁群类而独立存在
组合关系的类里含有另一个类的实例化
大雁类(Goose)在实例化之前 一定要先实例化翅膀类(Wings) 两个类紧密耦合在一起 它们有相同的生命周期 翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在
信息的封装性不同
在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的
而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。
-------------------------------------------------------------------------------------------------------
UML-泛化、关联、聚合、组合、依赖
一、泛化关系(generalization)
1.说明
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。
2.例图
3.表现
父类 父类实例=new 子类();
4.举例
class Animal{};
class Tigger : public Animal{};
class Dog : public Animal{};
Animal* pAnimal = new Dog;
二、关联关系(association)
1.说明
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
表示类与类之间的联接,有双向关联和单向关联,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向。
关联关系以实例变量的形式存在,在每一个关联的端点,还可以有一个基数(multiplicity),表明这一端点的类可以有几个实例。
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;
};
三、聚合关系(aggregation)
1.说明:
关联关系的一种,是强的关联关系。聚合是整体和个体的关系。聚合关系也是通过实例变量实现的。例如汽车、发动机、轮胎,一个汽车对象由一个发动机对象,四个轮胎对象组成。
当类之间有整体-部分关系的时候,我们就可以使用组合或者聚合。
2.例图
3.表现
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
4.举例
class CPU{};
class Memory{};
class Computer
{
CPU* mpCPU;
Memory* mpMemory;
};
四、组合关系(合成关系)(composition)
1.说明:
合成关系也是关联关系的一种,是比聚合关系更强的关系。合成关系是不能共享的。例如人有四肢、头等。
表示类之间整体和部分的关系,组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
2.例图
3.表现
4.举例
//同聚合关系,不过说语义不同
class Leg{};
class Arm{};
class Person
{
Leg mLeg;
Arm mArm;
};
五、依赖关系(Dependency)
1.说明:
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
与关联关系不同的是,依赖关系是以参数变量的形式传入到依赖类中的,依赖是单向的,要避免双向依赖。一般来说,不应该存在双向依赖。
依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖。
2.例图
3.表现
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
4.举例
class Car{};
class House{};
class Person
{
void buy(Car& car){}
void buy(House* pHouse){}
};
六、关系之间的区别
1.聚合与组合
(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
(2)部件的生命周期不同
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。
2.关联和聚合
(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
3.关联和依赖
(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。
4.综合比较
这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:
组合>聚合>关联>依赖;
-----------------------------------------------------------------------------------------------------------------------------------------------
以下分清了依赖与关联的区别
类与类之间的关系对于理解面向对象具有很重要的作用,以前在面试的时候也经常被问到这个问题,在这里我就介绍一下。
类与类之间存在以下关系: (1)泛化(Generalization) (2)关联(Association) (3)依赖(Dependency) (4)聚合(Aggregation)
UML图与应用代码例子:
1.泛化(Generalization)
[泛化]
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。
[具体表现]
父类 父类实例=new 子类()
[UML图](图1.1)
图1.1 Animal类与Tiger类,Dog类的泛化关系
[代码表现]
- classAnimal{}
- class Tiger extends Animal{}
- public class Test
- {
- public void test()
- {
- Animal a=new Tiger();
- }
- }
2.依赖(Dependency)
[依赖]
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
[具体表现]
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
[现实例子]
比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作
[UML表现](图1.2)
图1.2 Person类与Screwdriver类的依赖关系
[代码表现]
-
public class Person{
-
/** 拧螺丝 */
-
public void screw(Screwdriver screwdriver){
-
screwdriver.screw();
-
}
-
}
3.关联(Association)
[关联]
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
[具体表现]
关联关系是使用实例变量来实现
[现实例子]
比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司
[UML图] (图1.3)
图1.3 公司和员工的关联关系
[代码表现]
- publicclass Company{
- private Employee employee;
- public Employee getEmployee(){
- return employee;
- }
- public void setEmployee(Employee employee){
- this.employee=employee;
- }
- //公司运作
- public void run(){
- employee.startWorking();
- }
- }
(4)聚合(Aggregation)
[聚合]
当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。
[具体表现]
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
[关联与聚合的区别]
(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。
聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。
(2)对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整 体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和 内存)拆了下来。
[UML图](图1.4)
图1.3 电脑和组件的聚合关系
[代码表现]
-
public class Computer{
-
private CPU cpu;
-
public CPU getCPU(){
-
return cpu;
-
}
-
public void setCPU(CPU cpu){
-
this.cpu=cpu;
-
}
-
//开启电脑
-
public void start(){
-
//cpu运作
-
cpu.run();
-
}
相关推荐
UML java 图示6种类关系,帮忙理解uml的基本概念。
标题“RocketMQ_UML图示说明”和描述表明,本文将讨论淘宝开源的分布式消息中间件RocketMQ的UML图。UML(统一建模语言)是一种标准的图形化建模语言,用于软件系统的建模、设计和文档编制,特别适合于描述系统的结构...
其中,UML类图是最常用的一种图示方式,用于描述系统的静态结构。在UML类图中,类与类之间的关系对于理解系统的结构至关重要。本文将详细介绍UML类图中的六种基本关系:依赖、类属、关联、实现、聚合和组合。 #### ...
在UML(统一建模语言)中,这些关系通过特定的图示来表达,有助于开发者更好地理解和沟通设计思路。本文将详细解析六种常见的类与类之间的关联关系,并通过UML图示进行详解。 1. **依赖(Dependency)**:依赖是最...
类的关系图, 类图, 通过starUML绘制的类类之间的关系图, 包含8中类的关系. 详细讲解见博客: http://my.oschina.net/whforever/blog/645501
UML(统一建模语言)是一种用于软件系统建模的标准化建模语言,它的类图是其中最常用的一种图示,用于表示系统中类的静态结构。关系数据库是目前主流的数据库管理系统,它利用关系模型来组织和存储数据。类图和关系...
类图是UML中用于表示类、接口及其关系的图形,包括继承、实现、关联、聚合和组合等关系。通过类图,开发者可以直观地理解类之间的层次结构和相互作用。用例图则描绘了系统与用户之间的交互,显示了系统提供的功能和...
#### 三、UML的图示工具 1. **用例图(Use Case Diagram)**:展示系统中的用例及其参与者。 2. **类图(Class Diagram)**:描述类的属性和方法,以及类之间的关系,如关联、聚合、组合、泛化和依赖等。 3. **...
4. **生成图示**:工具将源代码解析后生成UML类图和函数调用关系图。 5. **查看和分析**:使用图形查看器打开生成的图像,对代码结构进行分析。 此外,还有一些其他的工具,如Doxygen、CMake、Graphviz等,它们也...
9. **学习方法**:读者不仅需要理解UML的各个图示,还需要学会如何在实际项目中选择合适的模型,以及如何将设计模式融入到UML建模中,以提高软件设计的质量和可维护性。 通过《UML建模实例大全》,读者可以掌握UML...
UML是软件工程中不可或缺的建模工具,通过各种图示,它能清晰地呈现系统的架构、行为和关系。深入学习UML的英文参考,可以帮助我们更全面、准确地理解和应用这一强大的建模语言。无论是初学者还是经验丰富的开发者,...
对于准备UML考试的考生来说,掌握UML的核心概念、图示类型和使用场景至关重要。以下是对UML考试要点的详细梳理: 1. **UML的基本概念**: - UML是一种通用的、直观的建模语言,旨在促进软件开发过程中的沟通和协作...
UML试题通常涵盖了UML的核心概念、图示、用例、类、对象、关系以及建模过程等多个方面。在准备UML考试时,理解和掌握这些知识点至关重要。** **一、UML的基本概念** 1. **模型与模型元素**:UML是一种模型化语言,...
这样,Eclipse会显示一个图示化的表示,展示不同包之间的依赖关系,包括哪些包直接或间接引用了其他包。这种可视化表示使得识别和管理包间的耦合关系变得简单。 ModelGoon的强大之处还在于其高度的定制性。你可以...
本资料将涵盖UML的基本概念、图示类型以及在实际项目中的应用。 1. **UML基础**: - **UML定义**:UML是一种标准的建模语言,用于描述软件系统的结构和行为,它结合了多种前人提出的建模方法,旨在提供一种通用的...
### UML基础知识与考试要点解析 #### UML概述 统一建模语言(Unified Modeling Language,简称UML)是一种标准化的图形表示法,...对于UML的学习和掌握,需要从基础概念入手,逐步深入到具体的图示和技术应用中去。
通过本教程的学习,读者可以掌握UML的基本概念、图示以及在软件开发过程中的应用,从而提升面向对象设计的效率和质量。同时,对UML的深入理解和熟练运用也能为项目管理和团队协作带来显著的便利。
**UML的主要图示**: 1. **用例图(Use Case Diagram)**:描述系统外部用户(演员)与系统之间的交互。 2. **类图(Class Diagram)**:展示类、接口及其相互关系。 3. **序列图(Sequence Diagram)**:展示对象间...
1. **UML基础概念**:介绍UML的基本术语,如类、对象、接口、关系等,以及UML的核心元素,如用例图、静态结构图(类图、对象图、包图、组件图、部署图)、动态行为图(序列图、协作图、状态图、活动图)。...