类和类之间的依赖、关联、聚合、组合关系
类与类之间的6种关系
类与类之间的6种关系分别是:继承,实现,依赖,关联,聚合,组合。
1.继承:public class Father {}public class Son extends Father{//继承Father类}2.实现:public interface A {// 声明⼀个接⼝(注意:接⼝不是类)}public class B implements A{// 实现接⼝A}3.依赖:A类⽅法中的参数包含了B。
public class Car {public static void run(){System.err.println("汽车在跑");}}public class Driver {public void Driver(Car car) { //使⽤传递形参形成依赖car.run();}public void Driver() {//使⽤局部变量形成依赖Car car = new Car();car.run();}public void Driver1() {Car.run(); //使⽤静态⽅法形成依赖}}关联聚合组合:只给出⼀段代码判断是关联,聚合,还是组合关系,是⽆法判断的。
关联:类与类之间的联接,它使⼀个类知道另⼀个类的属性和⽅法。
例如A依赖于B,B就是A的全局变量。
聚合:聚合关系的两个类处于不同的层次,⼀个是整体,⼀个是部分。
例如汽车和零件组合:组合关系了表⽰2着缺⼀不可,同时存在同时消失。
常常会使⽤构造⽅法来达到初始化的⽬的,public Driver(Car car){ // 构造⽅法mycar = car;}。
UML类图的各符号含义
UML类图的各符号含义类图基本符号可拆分为虚线,箭头,实线,空心右三角,实心右三角,空心菱形和实心菱形。
由这些基本的图形进行组合构成了类图的基本符号。
这里要注意这几个符号的顺序,代表了类与类之间关系的耦合程度。
越向右耦合度越高。
其中虚线+箭头是表示即依赖的关系,实线+箭头表示关联的关系,虚线+空心右三角表示implements,实线+空心右三角表示的是泛化,即类的继承关系。
实线+空心菱形表示的是聚合的关系,实线+实心菱形则表示组合的关系。
另外一点是在看类图的时候要注意。
类图的思想其实也还没有脱离面向对象的思想,以某个类为中心,有些线是射入的而有些线是射出的。
射入的线表示的是这个类被哪些类所调用而射出的线则表示该类调用了哪些类,包括泛化,关联,依赖,聚合和组合四种关系。
这类似于离散数学中有关图部分的描述。
1. 类(Class):使用三层矩形框表示。
第一层显示类的名称,如果是抽象类,则就用斜体显示。
第二层是字段和属性。
第三层是类的方法。
注意前面的符号,‘+’表示public,‘-’表示private,‘#’表示protected。
2. 接口:使用两层矩形框表示,与类图的区别主要是顶端有<<interface>>显示。
第一行是接口名称。
第二行是接口方法。
3. 继承类(extends):用空心三角形+实线来表示。
4. 实现接口(implements):用空心三角形+虚线来表示5. 关联(Association):用实线箭头来表示,例如:燕子与气候6. 聚合(Aggregation):用空心的菱形+实线箭头来表示聚合:表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分,例如:公司和员工组合(Composition):用实心的菱形+实线箭头来表示组合:部分和整体的关系,并且生命周期是相同的。
例如:人与手7. 依赖(Dependency):用虚线箭头来表示,例如:动物与氧气8. 基数:连线两端的数字表明这一端的类可以有几个实例,比如:一个鸟应该有两只翅膀。
UML中的四种关系总结
UML中的四种关系总结UML中的关系主要包含四种:关联关系、依赖关系、泛化关系、实现关系。
当中关联关系还包含聚合关系和组合关系。
1、关联关系(Association)关联关系式⼀种结构化的关系,是指⼀种对象和还有⼀种对象有联系。
给定关联的两个类。
能够从当中的⼀个类的对象訪问到还有⼀个类的相关对象。
关联关系⽤⼀条实线表⽰。
演⽰样例1.1、聚合关系(Aggregation)聚合是关联的特例。
聚合是表⽰总体与部分的关系,即has a 关系。
聚合关系中的总体和部分是能够分离的,他们能够具有各⾃的⽣命周期,部分能够数据多个总体对象。
演⽰样例1.2、组合关系(Composition)组合关系式关联关系的⼀种特例。
他体现的是⼀种contains a的关系。
这样的关系⽐聚合更强。
它相同也体现了总体与部分的关系。
此时总体与部分是不可分的,总体的⽣命周期结束也就意味着部分的⽣命周期结束。
演⽰样例`2、依赖关系(Dependency)依赖关系式类与类之间的连接,表⽰⼀个类依赖于还有⼀个类的定义。
当中⼀个类元素是独⽴的,还有⼀个类元素不是独⽴的,它依赖与独⽴的那个类。
假设独⽴的类改变,将影响依赖与它的那个类。
演⽰样例3、泛化关系(Generalization)泛化关系式⼀个类(⼦类、⼦接⼝)继承另外⼀个类(⽗类、⽗接⼝)的功能。
⼦类还能够添加⾃⼰的新功能。
继承是类与类或者接⼝与⼏⼝之间最常见的关系之中的⼀个。
4、实现关系(Realization)实现关系指的是⼀个class类实现interface接⼝(能够是多个)的功能;实现是类与接⼝之间最常见的关系。
演⽰样例:⽐較聚合关系VS组合关系组合跟聚合差点⼉同样,唯⼀差别就是“部分”不能脱离“总体”⽽单独存在。
关联关系VS聚合关系关联关系中两个类是出于同样的层次。
⽽聚合关系中两个类是出于不平等的层次,⼀个表⽰总体,⼀个表⽰部分。
请简述uml中四种基本关系的含义和作用
请简述uml中四种基本关系的含义和作用UML(Unified Modeling Language)是一种用于软件系统建模的标准语言。
在UML中,有四种基本关系,分别为依赖关系、关联关系、聚合关系和组合关系。
下面将对每种关系的含义和作用进行详细的解释。
1.依赖关系:依赖关系表示一个类的改变会引起另一个类的改变,但是两个类之间的关系不是强依赖的。
在依赖关系中,一个类需要另一个类的一些功能或资源才能完成自己的任务。
依赖关系通常体现在方法参数、方法返回值、方法中的局部变量或静态方法的调用等方面。
作用:-解耦:依赖关系可以降低类之间的依赖程度,提高系统的灵活性和可维护性。
-重用:通过依赖关系,一个类可以复用另一个类的功能,提高代码的重用性。
-扩展:通过依赖关系,一个类可以使用另一个类的功能,使得系统可以更方便地进行扩展和演化。
2.关联关系:关联关系表示类与类之间的连接,用于描述类之间的结构性的、静态的关系。
在关联关系中,一个类对象可以通过引用来使用另一个类对象的功能和资源。
关联关系一般是双向的,可以是单向的、双向的或自反的。
作用:-数据共享:通过关联关系,类可以共享另一个类的数据,实现数据的共享和交流。
-在系统的结构设计中起到桥梁作用:关联关系可以用于描述系统的结构,帮助开发人员对系统进行设计和实现。
3.聚合关系:聚合关系表示整体与部分之间的关系,它是一种弱的关联关系。
在聚合关系中,整体对象可以包含部分对象,但是部分对象的生命周期可以独立于整体对象而存在。
作用:-描述整体与部分之间的关系:聚合关系可以用于描述整体与部分之间的关系,帮助开发人员更好地理解系统的结构。
-组织和结构化数据:通过聚合关系,可以将对象进行组织和结构化,使得数据的管理更加便捷。
4.组合关系:组合关系也表示整体与部分之间的关系,但是它是一种强的关联关系。
在组合关系中,整体对象包含了部分对象,同时部分对象的生命周期与整体对象的生命周期相同。
UML图中类之间的关系_依赖,泛化,关联,聚合,组合,实现答辩
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现1.2.3.4.5.6.类与类图1 类(Class封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。
2 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。
一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。
3 类的属性即类的数据职责,类的操作即类的行为职责一、依赖关系(Dependence依赖关系(Dependence):假设A类的变化引起了B 类的变化,则说名B类依赖于A类。
• 依赖关系(Dependency 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
• 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
[java] view plaincopyprint?1. public class Driver2. {3. public void drive(Car car4. {5. car.move(;6. }7. ……8. }9. public class Car10. {11. public void move(12. {13. ......14. }15. ……16. }{car.move(;}……}public class Car{public void move({......}……}依赖关系有如下三种情况:1、A类是B类中的(某中方法的)局部变量;2、A类是B类方法当中的一个参数;3、A类向B类发送消息,从而影响B类发生变化;GeneralizationGeneralization A是B和C的父类,B,C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)• 泛化关系(Generalization也就是继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。
类与类之间的六种关系
类与类之间的六种关系在面向对象编程中,类与类之间有六种关系,分别是继承、实现、聚合、组合、关联和依赖。
这些关系描述了不同类之间的联系和依赖,有助于我们更好地设计和组织程序。
继承是一种类与类之间的关系,它描述了一个类从另一个类继承属性和方法的过程。
继承可以减少代码的重复,提高代码的可维护性和可扩展性。
例如,一个动物类可以作为其他类的父类,其他类可以继承动物类的属性和方法,如狗类、猫类等。
实现是一种类与接口之间的关系,它描述了一个类实现接口的过程。
接口定义了一组方法,实现了接口的类必须实现这些方法。
实现可以使代码更加灵活,可以在不同的类中实现相同的接口,从而实现代码的复用。
聚合是一种“整体-部分”的关系,它描述了一个类包含其他类的实例的过程。
聚合表示一种弱的“拥有”关系,即一个类可以包含多个其他类的实例,但这些实例可以独立存在。
例如,一个汽车类可以包含多个轮子类的实例,但轮子类的实例可以独立存在。
组合是一种“整体-部分”的关系,它描述了一个类包含其他类的实例,并且这些实例不能独立存在的过程。
组合表示一种强的“拥有”关系,即一个类包含其他类的实例,这些实例不能独立存在。
例如,一个房子类可以包含多个房间类的实例,但房间类的实例不能独立存在。
关联是一种类与类之间的关系,它描述了一个类与另一个类之间的联系。
关联可以是单向的或双向的,可以是强的或弱的。
例如,一个人类可以与一个手机类之间存在关联,表示这个人拥有这个手机。
依赖是一种类与类之间的关系,它描述了一个类依赖于另一个类的过程。
依赖表示一个类使用了另一个类的实例或方法,但不拥有这个实例或方法。
例如,一个人类可以依赖于一个汽车类的实例,表示这个人需要使用这个汽车来出行。
类与类之间的六种关系描述了不同类之间的联系和依赖,有助于我们更好地设计和组织程序。
在实际编程中,我们需要根据具体情况选择不同的关系,以实现代码的复用、可维护性和可扩展性。
软件设计之UML—UML中的六大关系
软件设计之UML—UML中的六⼤关系⼀、UML中的六⼤关系在UML类图中,常见的有以下⼏种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。
1.1、继承关系—泛化(Generalization)指的是⼀个类(称为⼦类、⼦接⼝)继承另外的⼀个类(称为⽗类、⽗接⼝)的功能,并可以增加它⾃⼰的新功能的能⼒,继承是类与类或者接⼝与接⼝之间最常见的关系;在Java中⽤extends关键字。
【泛化关系】是⼀种继承关系,表⽰⼀般与特殊的关系,它指定了⼦类如何特化⽗类的所有特征和⾏为。
例如:猫头鹰是鸟的⼀种,即有鸟的特性也有猫头鹰的共性。
【箭头指向】带三⾓箭头的实线,箭头指向⽗类。
【描述】上图中的类bird有嘴、翅膀、⽻⽑等属性。
会飞、会唧唧喳喳的叫,那么就有这些⽅法。
⽽猫头鹰有⼤眼睛和捕捉⽼⿏的本领,这则是⾃⾝的特性。
1.2、实现关系(Realization)指的是⼀个class类实现interface接⼝(可以是多个)的功能;实现是类与接⼝之间最常见的关系;在Java中此类关系通过关键字implements明确标识。
【实现关系】是⼀种类与接⼝的关系,表⽰类是接⼝所有特征和⾏为的实现.【箭头指向】带三⾓箭头的虚线,箭头指向接⼝。
【描述】上图中IFly是⼀个接⼝,接⼝中有时间、速度等常量,还有⼀个fly⽅法。
FlyImpl继承了这个IFly接⼝后,需要实现fly⽅法,同时实现类也可以拥有⾃⼰的属性和⽅法。
1.3、依赖(Dependency)可以简单的理解,就是⼀个类A使⽤到了另⼀个类B,⽽这种使⽤关系是具有偶然性的、临时性的、⾮常弱的,但是B类的变化会影响到A;⽐如某⼈要过河,需要借⽤⼀条船,此时⼈与船之间的关系就是依赖;表现在代码层⾯,为类B作为参数、属性被类A 在某个method⽅法中使⽤;【依赖关系】是⼀种使⽤的关系,即⼀个类的实现需要另⼀个类的协助,所以要尽量不使⽤双向的互相依赖。
类与类之间的关系(继承、实现、依赖、关联、聚合、组合)
唐僧与徒弟是单向关联 徒弟与悟空、悟能、悟净是双向关联
聚合
当对象A被加入到对象B中,成为对象B的组成部分时, 对象B和对象A之间为聚合关系。聚合关系是关联关系的 一种,是强的关联关系。聚合是整体去个体之间的关系。 此时的整体与部分之间是可分离性的它们各自具有自己 的生命周期,部分可以属于多个整体对象,也可以为多 个整体对象共享。
强弱关系为: 组合>聚合>关联>依赖
实例: 当你要渡河时,就必须要调用船类
中的渡河方法。这就是依赖
人
船类 渡河
关联
两个相对独立的对象,当一个对象的实例与另一个对象的特定 实例存在固定关系时,就存在关联。亦是一种强的依赖性。不 存在依赖的偶然性、临时性。是长时性的。而且双方是平等的。 可以是单向的、也可以是双向的。
单向关联
类A认识类B,类A知道类B的存在,类A可以调用类B的方法。 代码表现:类A中有类B的变量或引用。
public class abstract Parents{ public abstract void method();
}
public class Child extends Parents{ public void method(){
} }
属性 方法
接口
接口就是在接口中写出方法,然后在调用接口类 时实现所有接口类中方法。java中通过 interface来表示接口。其一个类可以实现多个 接口,用implement来实现接口,用“,”来 连接多个接口。接口不能够被实例化。
组合也是关联关系的一种它是比聚合更加体现整体与个体之间的关系的整体与个体是不可分的当整体结束时个体就意味着结束个体离开整体时将不能够生存
类与类之间的关系
UML类图符号 各种关系说明以及举例
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. 继承关系(Inheritance)继承是一种类与类之间最基本的关系之一。
通过继承,一个类可以继承另一个类的属性和方法,从而构建出一个新的类,新的类在功能方面可以包含父类的所有特性,也可以在此基础上增加自身的新特性。
2. 实现关系(Implementation)实现关系是一种类与接口(接口是一种规范,只包含方法定义)之间的关系。
一个类可以实现一个接口,从而获得该接口定义的所有方法,该类必须实现接口中所有的方法。
实现关系实现了接口与类的分离,提高了代码的灵活性和可重用性。
3. 聚合关系(Aggregation)聚合关系是一种“部分与整体”的关系,即一个类(整体)可以包含另一个类(部分)作为它的一个组成部分,与此同时,一个部分可以属于多个整体。
聚合关系常常用于构建复杂对象,可以形成一些常见的设计模式,如观察者模式、组合模式等。
4. 组合关系(Composition)组合关系也是一种“部分与整体”的关系,与聚合关系不同的是,组合关系强调整体与部分的生命周期一致,即一个整体被销毁时,它的所有部分也将被销毁。
组合关系常用于构建复杂的对象,例如 window 对象里面包含了多个控件。
5. 依赖关系(Dependency)依赖关系是一种“使用与被使用”的关系,即一个类使用了另一个类的服务,而这种使用关系通常是一种短暂的关系,只存在于方法调用的过程中。
依赖关系体现了类与类之间的耦合性,降低了代码的灵活性。
6. 关联关系(Association)关联关系是一种“拥有与被拥有”的关系,它比依赖关系更强,表现为一个类知道另一个类的存在,并且能够通过实例变量、静态变量等方式保存对另一个类的引用。
关联关系通常用于构建一些复杂的系统,比如 UML 中的类图,它们用集合来表示关联关系。
关联--依赖、组合--聚合 联系与区别
关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。
----------------------------------------------------------------------------------------------------------------------------------
聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。
聚合中的被包含对象可以没有。 而组合至少有一个。聚合是一种拥有的关系,而组合是整体与部分的关系
举一个简单的例子:
一个图书馆可以有十万本书,也可以一本也没有。但空的图书馆还是图书馆。这是聚合
一个车(我们平常能看到的普通的交通工具车)有轮子,有的车是四轮子的,有的车是三轮的,自行车是二轮的,还有独轮车,但车至少要有一个轮子,不然就不是车。这是组合关系。
同构性,主体和部分不具有生命期的一致性
课程组可由多个学生组成,课程组撤消了,学生还活得好好的,这是聚合。
类与类之间的关系
类与类之间的关系⼀. 类与类之间的依赖关系⼤千世界, 万物之间皆有规则和规律. 我们的类和对象是对⼤千世界中的所有事物进⾏归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在⾯向对象的世界中. 类与类中存在以下关系: 1. 依赖关系 2. 关联关系 3. 组合关系 4. 聚合关系 5. 继承关系 6. 实现关系由于python是⼀⻔弱类型编程语⾔. 并且所有的对象之间其实都是多态的关系. 也就是说,所有的东⻄都可以当做对象来使⽤. 所以我们在写代码的时候很容易形成以上关系. ⾸先. 我们先看第⼀种, 也是这些关系中紧密程度最低的⼀个, 依赖关系.⾸先, 我们设计⼀个场景. 还是最初的那个例⼦. 要把⼤象装冰箱. 注意. 在这个场景中, 其实是存在了两种事物的. ⼀个是⼤象, ⼤象负责整个事件的掌控者, 还有⼀个是冰箱, 冰箱负责被⼤象操纵.⾸先, 写出两个类, ⼀个是⼤象类, ⼀个是冰箱类.class Elphant:def__init__(self, name): = namedef open(self):'''开⻔:return :return:'''passdef close(self):'''关⻔:return :return:'''passclass Refrigerator:def open_door(self):print("冰箱⻔被打开了")def close_door(self):print("冰箱⻔被关上了")冰箱的功能⾮常简单, 只要会开⻔, 关⻔就⾏了. 但是⼤象就没那么简单了. 想想. ⼤象开⻔和关⻔的时候是不是要先找个冰箱啊. 然后呢? 打开冰箱⻔. 是不是打开刚才找到的那个冰箱⻔. 然后装⾃⼰. 最后呢? 关冰箱⻔, 注意, 关的是刚才那个冰箱吧. 也就是说. 开⻔和关⻔⽤的是同⼀个冰箱. 并且. ⼤象有更换冰箱的权利, 想进那个冰箱就进那个冰箱. 这时, ⼤象类和冰箱类的关系并没有那么的紧密. 因为⼤象可以指定任何⼀个冰箱. 接下来. 我们把代码完善⼀下.class Elphant:def__init__(self, name): = namedef open(self, ref):print("⼤象要开⻔了. 默念三声. 开!")# 由外界传递进来⼀个冰箱, 让冰箱开⻔. 这时. ⼤象不⽤背着冰箱到处跑.# 类与类之间的关系也就不那么的紧密了. 换句话说. 只要是有open_door()⽅法的对象. 都可以接收运⾏ref.open_door()def close(self, ref):print("⼤象要关⻔了. 默念三声. 关!")passdef take(self):print("钻进去")class Refrigerator:def open_door(self):print("冰箱⻔被打开了")def close_door(self):print("冰箱⻔被关上了")# 造冰箱r = Refrigerator()# 造⼤象el = Elphant("神奇的⼤象")el.open(r) # 注意. 此时是把⼀个冰箱作为参数传递进去了. 也就是说. ⼤象可以指定任何⼀个冰箱.el.take()el.close(r)此时, 我们说, ⼤象和冰箱之间就是依赖关系. 我⽤着你. 但是你不属于我. 这种关系是最弱的.⽐如. 公司和雇员之间. 对于正式员⼯, 肯定要签订劳动合同. 还得⼩⼼伺候着. 但是如果是兼职. 那⽆所谓. 需要了你就来. 不需要你就可以拜拜了. 这⾥的兼职(临时⼯) 就属于依赖关系.我⽤你. 但是你不属于我.⼆. 关联关系.组合关系, 聚合关系其实这三个在代码上写法是⼀样的. 但是, 从含义上是不⼀样的. 1. 关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的. 2. 聚合关系. 属于关联关系中的⼀种特例. 侧重点是xxx和xxx聚合成xxx. 各⾃有各⾃的 声明周期. ⽐如电脑. 电脑⾥有CPU, 硬盘, 内存等等. 电脑挂了. CPU还是好的. 还是 完整的个体 3. 组合关系. 属于关联关系中的⼀种特例. 写法上差不多. 组合关系⽐聚合还要紧密. ⽐ 如⼈的⼤脑, ⼼脏, 各个器官. 这些器官组合成⼀个⼈. 这时. ⼈如果挂了. 其他的东⻄ 也跟着挂了.⾸先我们看关联关系: 这个最简单. 也是最常⽤的⼀种关系. ⽐如. ⼤家都有男⼥朋友. 男⼈关联着⼥朋友. ⼥⼈关联着男朋友. 这种关系可以是互相的, 也可以是单⽅⾯的.class Boy:def__init__(self, name, girlFriend=None): = nameself.girlFriend = girlFrienddef have_a_dinner(self):if self.girlFriend:print("%s 和 %s⼀起去吃晚餐" % (, ))else:print("单⾝狗. 吃什么饭")class Girl:def__init__(self, name): = nameb = Boy("alex")b.have_a_dinner()# 突然⽜B了. 找到⼥朋友了g = Girl("如花")b.girlFriend = g # 有⼥朋友了. 6666b.have_a_dinner()gg = Girl("李⼩花")bb = Boy("wusir", gg) # 娃娃亲. 出⽣就有⼥朋友. 服不服bb.have_a_dinner() # 多么幸福的⼀家# 突然.bb失恋了. 娃娃亲不跟他好了bb.girlFriend = Nonebb.have_a_dinner() # ⼜单⾝了.注意. 此时Boy和Girl两个类之间就是关联关系. 两个类的对象紧密练习着. 其中⼀个没有了. 另⼀个就孤单的不得了. 关联关系, 其实就是我需要你. 你也属于我. 这就是关联关系. 像这样的关系有很多很多. ⽐如. 学校和⽼师之间的关系.School --- 学校Teacher--- ⽼师⽼师必然属于⼀个学校. 换句话说. 每个⽼师肯定有⼀个指定的⼯作机构. 就是学校. 那⽼师的属性中必然关联着学校.class School:def__init__(self, name, address): = nameself.address = addressclass Teacher:def__init__(self, name, school=None): = nameself.school = schools1 = School("⽼男孩北京校区", "美丽的沙河")s2 = School("⽼男孩上海校区", "迪⼠尼旁边")s3 = School("⽼男孩深圳校区", "南⼭区法院欢迎你")t1 = Teacher("⾦王", s1)t2 = Teacher("银王", s1)t3 = Teacher("海峰", s2)t4 = Teacher("⾼鑫", s3)# 找到⾼鑫所在的校区地址print(t4.school.address)想想, 这样的关系如果反过来. ⼀个⽼师可以选⼀个学校任职, 那反过来. ⼀个学校有多少⽼师呢? ⼀堆吧? 这样的关系如何来描述呢?def__init__(self, name, address): = nameself.address = addressself.t_list = [] # 每个学校都应该有⼀个装⼀堆⽼师的列表def add_teacher(self, teacher):self.t_list.append(teacher)class Teacher:def__init__(self, name, school=None): = nameself.school = schools1 = School("⽼男孩北京校区", "美丽的沙河")s2 = School("⽼男孩上海校区", "迪⼠尼旁边")s3 = School("⽼男孩深圳校区", "南⼭区法院欢迎你")t1 = Teacher("⾦王", s1)t2 = Teacher("银王", s1)t3 = Teacher("海峰", s2)t4 = Teacher("⾼鑫", s3)s1.add_teacher(t1)s1.add_teacher(t2)s1.add_teacher(t3)# 查看沙河校区有哪些⽼师for t in s1.t_list:print()好了. 这就是关联关系. 当我们在逻辑上出现了. 我需要你. 你还得属于我. 这种逻辑就是关联关系. 那注意. 这种关系的紧密程度⽐上⾯的依赖关系要紧密的多. 为什么呢? 想想吧⾄于组合关系和聚合关系. 其实代码上的差别不⼤. 都是把另⼀个类的对象作为这个类的属性来传递和保存. 只是在含义上会有些许的不同⽽已.三. 继承关系.在⾯向对象的世界中存在着继承关系. 我们现实中也存在着这样的关系. 我们说过. x是⼀种y, 那x就可以继承y. 这时理解层⾯上的. 如果上升到代码层⾯. 我们可以这样认为. ⼦类在不影响⽗类的程序运⾏的基础上对⽗类进⾏的扩充和扩展. 这⾥.我们可以把⽗类被称为超类或者基类. ⼦类被称为派⽣类.⾸先, 类名和对象默认是可以作为字典的key的class Foo:def__init__(self):passdef method(self):pass# __hash__ = Noneprint(hash(Foo))print(hash(Foo()))既然可以hash. 那就是说字典的key可以是对象或者类dic = {}dic[Foo] = 123dic[Foo()] = 456print(dic) # {<class '__main__.Foo'>: 123, <__main__.Foo object at0x103491550>: 456}虽然显⽰的有点⼉诡异. 但是是可以⽤的.接下来. 我们来继续研究继承上的相关内容. 在本节中主要研究⼀下self. 记住. 不管⽅法之间如何进⾏调⽤. 类与类之间是何关系. 默认的self都是访问这个⽅法的对象.class Base:def__init__(self, num):self.num = numdef func1(self):print(self.num)class Foo(Base):passobj = Foo(123)obj.func1() # 123 运⾏的是Base中的func1继续:class Base:def__init__(self, num):self.num = numdef func1(self):print(self.num)class Foo(Base):def func1(self):print("Foo. func1", self.num)obj.func1() # Foo. func1 123 运⾏的是Foo中的func1再来:class Base:def__init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print("Base.func2")class Foo(Base):def func2(self):print("Foo.func2")obj = Foo(123)obj.func1() # 123 Foo.func2 func1是Base中的 func2是⼦类中的总结. self在访问⽅法的顺序: 永远先找⾃⼰的. ⾃⼰的找不到再找⽗类的.接下来. 来难得:class Base:def__init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print(111, self.num)class Foo(Base):def func2(self):print(222, self.num)lst = [Base(1), Base(2), Foo(3)]for obj in lst:obj.func2() # 111 1 | 111 2 | 222 3再来. 还不够绕.class Base:def__init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print(111, self.num)class Foo(Base):def func2(self):print(222, self.num)lst = [Base(1), Base(2), Foo(3)]for obj in lst:obj.func1() # 那笔来吧. 好好算结论: self就是你访问⽅法的那个对象. 先找⾃⼰, 然后在找⽗类的.四. 类中的特殊成员什么是特殊成员呢? __init_()就是⼀个特殊的成员. 说⽩了. 带双下划线的那⼀坨. 这些⽅法在特殊的场景的时候会被⾃动的执⾏. ⽐如, 1. 类名() 会⾃动执⾏__init__() 2. 对象() 会⾃动执⾏__call__() 3. 对象[key] 会⾃动执⾏__getitem__() 4. 对象[key] = value 会⾃动执⾏__setitem__() 5. del 对象[key] 会⾃动执⾏ __delitem__() 6. 对象+对象会⾃动执⾏ __add__() 7. with 对象 as 变量会⾃动执⾏__enter__ 和__exit__ 8. 打印对象的时候会⾃动执⾏ __str__ 9. ⼲掉可哈希 __hash__ == None 对象就不可哈希了.创建对象的真正步骤:⾸先, 在执⾏类名()的时候. 系统会⾃动先执⾏__new__()来开辟内存. 此时新开辟出来的内存区域是空的. 紧随其后, 系统⾃动调⽤__init__()来完成对象的初始化⼯作. 按照时间轴来算. 1. 加载类 2. 开辟内存(__new__) 3. 初始化(__init__) 4. 使⽤对象⼲xxxxxxxxx类似的操作还有很多很多. 我们不需要完全刻意的去把所有的特殊成员全都记住. 实战中也⽤不到那么多. ⽤到了查就是了.。
UML的类图关系分为:关联、聚合组合、依赖、泛化(继承)
UML的类图关系分为:关联、聚合组合、依赖、泛化(继承)UML的类图关系分为:关联、聚合/组合、依赖、泛化(继承)。
⽽其中关联⼜分为双向关联、单向关联、⾃⾝关联;下⾯就让我们⼀起来看看这些关系究竟是什么,以及它们的区别在哪⾥。
1、关联双向关联:C1-C2:指双⽅都知道对⽅的存在,都可以调⽤对⽅的公共属性和⽅法。
在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适⽤的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引⽤或指针。
对象引⽤本⾝就是有向的,更适合表达我们所讨论的那种关系。
所以这种关系在设计的时候⽐较少⽤到,关联⼀般都是有向的。
使⽤ROSE ⽣成的代码是这样的:class C1...{public:C2* theC2;};class C2...{public:C1* theC1;};双向关联在代码的表现为双⽅都拥有对⽅的⼀个指针,当然也可以是引⽤或者是值。
单向关联:C3->C4:表⽰相识关系,指C3知道C4,C3可以调⽤C4的公共属性和⽅法。
没有⽣命期的依赖。
⼀般是表⽰为⼀种引⽤。
⽣成代码如下:class C3...{public:C4* theC4;};class C4...{};单向关联的代码就表现为C3有C4的指针,⽽C4对C3⼀⽆所知。
⾃⾝关联(反⾝关联):⾃⼰引⽤⾃⼰,带着⼀个⾃⼰的引⽤。
代码如下:class C14...{public:C14* theC14;};就是在⾃⼰的内部有着⼀个⾃⾝的引⽤。
2、聚合/组合当类之间有整体-部分关系的时候,我们就可以使⽤组合或者聚合。
聚合:表⽰C9聚合C10,但是C10可以离开C9⽽独⽴存在(独⽴存在的意思是在某个应⽤的问题域中这个类的存在有意义。
这句话怎么解,请看下⾯组合⾥的解释)。
代码如下:class C9...{public:};class C10...{};组合(也有⼈称为包容):⼀般是实⼼菱形加实线箭头表⽰,如上图所⽰,表⽰的是C8被C7包容,⽽且C8不能离开C7⽽独⽴存在。
类与类之间的关系
类之间的关系有五种:继承、依赖、关联、聚合、组合。
1.继承指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。
这个很好理解,没什么可讲的。
2.依赖可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method 方法中使用;3.关联(Association)这体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;4.聚合aggregation聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;5.组合Composition组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;6.依赖、关联、聚合、组合之间的区别几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。
依赖、关联、聚合、组合、泛化讨论
依赖、关联、聚合、组合、泛化讨论类之间有依赖、关联、聚合、组合、泛化五种关系。
依赖关系表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。
这种依赖关系是一种使用关系(use a),具有偶然性、临时性,关系非常弱,但被依赖类的变化会影响到使用它的类,比如某人过河需要一条船,此时人与船之间的关系就是依赖。
在代码中表现为函数中的参数。
如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。
如图1所示。
图1 依赖关系关联关系是类与类之间的联接,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
表现为拥有关系(has a ),如果A拥有B,则B 是A的全局变量,它使一个类知道另一个类的属性和方法。
关联关系有双向关联和单向关联。
双向关联:两个类彼此知道另一个类的公共属性和操作。
单向关联:只有一个类知道另外一个类的公共属性和操作。
大多数关联应该是单向的,单向关系更容易建立和维护,有助于寻找可复用的类。
如图2所示。
聚合关系是关联关系的一种,是强的关联关系。
聚合关系是整体和个体的关系。
普通关联关系的两个类处于同一层次上,而聚合关系的两个类处于不同的层次,一个是整体,一个是部分。
聚合关系是一种弱的“拥有”关系,体现的是A 对象可以包含B 对象,但B 对象不是A 对象的组成部分。
如果A 由B 聚合而成,表现为A 包含有B 的全局对象,但是B 对象可以不在A 创建的时刻创建。
如图3所示。
组合关系是关联关系的一种,是比聚合关系强的关系。
它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
组合关系是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一致。
如果A 由B 组成,表现为A 包含有B 的全局对象,并且B 对象在A 创建的时刻创建。
依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系
依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现
关系
依赖关系:表示一个类的变化会影响另一个类,但两个类之间并不存在拥有和共享的关系。
类之间通过参数传递、方法调用等方式产生依赖关系。
关联关系:表示两个类之间的联系,强调的是它们之间的共享。
关联关系可以是单向的或双向的,可以是一对一的、一对多的或多对多的。
聚合关系:表示整体与部分之间的关系,整体对象拥有部分对象,但部分对象不是整体对象的一部分。
聚合关系是一种弱关联关系,两个对象的生命周期可以独立。
组合关系:也表示整体与部分之间的关系,但部分对象是整体对象的一部分,没有它们整体对象就无法存在。
组合关系是一种强关联关系,两个对象的生命周期是相互依赖的。
泛化关系:表示一个类是另一个类的特殊形式,继承关系的表示方式之一。
泛化关系体现了一种继承和特化的关系,子类继承了父类的属性和方法,并可以进行扩展和覆盖。
实现关系:表示一个类实现了一个接口,接口可以定义一组规范,类需要实现这些规范中定义的方法。
实现关系实现了一种接口或协议,在面向对象的编程中强调了一种规范和标准的约定。
类与类之间的关系--泛化,关联,依赖,实现
类与类之间的关系--泛化,关联,依赖,实现类,对象是⾯向对象的基础,类与类之间的关系是⾯向对象不可或缺的⼀部分。
以下将从类的关系定义,UML中的符号表⽰,代码实现三⽅⾯介绍类与类之间的关系。
1、泛化(Generalization):也成为继承关系。
指⼀个类(⼦类或者⼦接⼝)继承另外⼀个类(⽗类或者⽗接⼝)的功能。
并能够添加⾃⼰的功能。
在程序程序中⽤keywordextends明⽩标识,在UML设计中⽤空三⾓和实线表⽰。
从⼦类指向⽗类。
或者⼦接⼝指向⽗接⼝。
如图代码:public class Cat {public Cat(){}public void Eat(){}public void Run(){}public void Walk(){}}⼦类演⽰样例public class WhiteCat extends Cat {public WhiteCat(){}public void Eat(){}public void Run(){}public void Walk(){}}2、实现(Realize)是指⼀个class 实现interface接⼝的功能,⽤keywordimplements标识。
在UML设计中⽤⼀条带空⼼箭头的虚线表⽰,箭头指向接⼝。
如图代码:public interface Iaction {public void drink();public void eat();}public class dog implements Iaction {public dog(){}public void finalize() throws Throwable {}public void drink(){}public void eat(){}}3、依赖(Dependency)是指⼀个类A使⽤到了还有⼀个类B,⽽这样的使⽤关系是具有偶然性、暂时性。
可是类B的变化会影响到类A。
表如今代码层⾯,为类B作为參数被类A在某个⽅法中使⽤。
类与类之间的关系-依赖-关联-聚合-组合
类与类之间的关系-依赖-关联-聚合-组合1)依赖依赖关系是类与类之间的联接。
⼀个类依赖于另⼀个类的定义。
如,⼀个⼈(Person)可以买车(Car)和房⼦(House),Person类依赖于Car和House的定义,因为Person引⼊了Car和House。
与关联不同的是,Person类中没有Car和House的属性,Car和House的实例是以参量的⽅式传⼊到buy()⽅法中的。
⼀般⽽⾔,依赖关系在Java语⾔中体现为局部变量,⽅法形参,或者对静态⽅法的调⽤。
2)关联关联是类与类之间的联接,使⼀个类知道另⼀个类的属性和⽅法。
关联可以是双向,也可以是单向的。
⼀般使⽤成员变量来实现。
3)聚合聚合是⼀种强的关联关系。
是整体和个体之间的关系。
例如,汽车类与引擎类,轮胎类之间的关系就是整体与个体之间的关系。
与关联关系⼀样,聚合关系也是通过实例变量实现的。
但是关联关系涉及的两个类在同⼀层次,⽽聚合关系中两个类处在不平等的层次上,⼀个代表整体,⼀个代表部分。
4)组合组合也是关联关系的⼀种,⼀种⽐聚合关系强的关系。
组合关系中的部分类不能独⽴于整体类存在。
整体类和部分类有相同的⽣命周期。
如Person类和Leg类。
5)继承/泛化泛化和继承其实是⼀个逆过程泛化就是有⼦类抽象出⼀个⽗类⽽继承就是由⽗类具体化⼀个⼦类例如⾜球⽐联赛跟什么西甲意甲英超之间就是泛化/继承的关系6)组合和聚合的区别组合和聚合都属于关联,所以它们之间难免有相似之处,区别举例来说明:程⽼师的《⼤话》⾥举⼤那个⼤雁的例⼦很贴切在此我就借⽤⼀下⼤雁喜欢热闹害怕孤独所以它们⼀直过着群居的⽣活这样就有了雁群每⼀只⼤雁都有⾃⼰的雁群每个雁群都有好多⼤雁⼤雁与雁群的这种关系就可以称之为聚合另外每只⼤雁都有两只翅膀⼤雁与雁翅的关系就叫做组合有此可见聚合的关系明显没有组合紧密⼤雁不会因为它们的群主将雁群解散⽽⽆法⽣存⽽雁翅就⽆法脱离⼤雁⽽单独⽣存——组合关系的类具有相同的⽣命周期聚合关系图:组合关系图:。
类图关系中各个符号的表示意义
类图关系中各个符号的表示意义类图基本符号可拆分为虚线,箭头,实线,空心右三角,实心右三角,空心菱形和实心菱形。
由这些基本的图形进行组合构成了类图的基本符号。
这里要注意这几个符号的顺序,代表了类与类之间关系的耦合程度。
越向右耦合度越高。
其中虚线+箭头是表示即依赖的关系,实线+箭头表示关联的关系,虚线+空心右三角表示implements,实线+空心右三角表示的是泛化,即类的继承关系。
实线+空心菱形表示的是聚合的关系,实线+实心菱形则表示组合的关系。
另外一点是在看类图的时候要注意。
类图的思想其实也还没有脱离面向对象的思想,以某个类为中心,有些线是射入的而有些线是射出的。
射入的线表示的是这个类被哪些类所调用而射出的线则表示该类调用了哪些类,包括泛化,关联,依赖,聚合和组合四种关系。
这类似于离散数学中有关图部分的描述。
1. 类(Class):使用三层矩形框表示。
第一层显示类的名称,如果是抽象类,则就用斜体显示。
第二层是字段和属性。
第三层是类的方法。
注意前面的符号,‘+’表示public,‘-’表示private,‘#’表示protected。
2. 接口:使用两层矩形框表示,与类图的区别主要是顶端有<<interface>>显示。
第一行是接口名称。
第二行是接口方法。
3. 继承类(extends):用空心三角形+实线来表示。
4. 实现接口(implements):用空心三角形+虚线来表示5. 关联(Association):用实线箭头来表示,例如:燕子与气候6. 聚合(Aggregation):用空心的菱形+实线箭头来表示聚合:表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分,例如:公司和员工组合(Composition):用实心的菱形+实线箭头来表示组合:部分和整体的关系,并且生命周期是相同的。
例如:人与手7. 依赖(Dependency):用虚线箭头来表示,例如:动物与氧气8. 基数:连线两端的数字表明这一端的类可以有几个实例,比如:一个鸟应该有两只翅膀。
UML类图(下):关联、聚合、组合、依赖
UML类图(下):关联、聚合、组合、依赖前⾔上⼀篇⽂章,讲了UML类图中类、继承、实现三种关系及其在UML类图中的画法,本⽂将接着上⽂的内容,继续讲讲对象之间的其他⼏种关系,主要就是关联、聚合、组合、依赖,下⾯开始⽂章的内容。
注意1:⼦类中覆盖了⽗类的abstract⽅法,⽅法名再次出现。
注意2:⽆论哪种关系,箭头指向被依赖⽅。
关联关系关联(Assocition)关系是类与类之间最常见的⼀种关系,它是⼀种结构化的关系,表⽰⼀类对象与另⼀类对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学⽣等。
在UML类图中,⽤实线连接有关联关系的对象所对应的类,在Java中通常将⼀个类的对象作为另⼀个类的成员变量。
关联关系分单向关联、双向关联、⾃关联,逐⼀看⼀下。
1、单向关联关系单向关联指的是关联只有⼀个⽅向,⽐如顾客(Customer)拥有地址(Address),其Java实现为:public class Address{}public class Customer{private Address address;}UML的画法为:2、双向关联关系默认情况下的关联都是双向的,⽐如顾客(Customer)购买商品(Product),反之,卖出去的商品总是与某个顾客与之相关联,这就是双向关联。
Java类的写法为:public class Product{private Customer customer;}public class Customer{private Product[] product;}对应的UML类图应当是:3、⾃关联关系⾃关联,指的就是对象中的属性为对象本⾝,这在链表中⾮常常见,单向链表Node中会维护⼀个它的前驱Node,双向链表Node中会维护⼀个它的前驱Node和⼀个它的后继Node。
就以单向链表为例,它的Java写法为:public class Node{private Node nextNode;}对应的UML类图应当是:聚合关系聚合(Aggregation)关系表⽰整体与部分的关系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、继承关系
继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。
在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。
二、实现关系
实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。
在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。
在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。
三、依赖关系
简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。
比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。
表现在代码层面,为类B作为参数被类A在某个method方法中使用。
在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示。
四、关联关系
关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
关联可以是单向、双向的。
表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。
在UML类图设计中,关联关系用由关联类A 指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。
五、聚合关系
聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。
此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。
表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
在UML类图设计中,聚合关系以空心菱形加实线箭头表示。
六、组合关系
组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。
它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。
表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
在UML类图设计中,组合关系以实心菱形加实线箭头表示。
七、总结
对于继承、实现这两种关系没多少疑问,它们体现的是一种类和类、或者类与接口间的纵向关系。
其他的四种关系体现的是类和类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的。
前面也提到,这四种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。