类之间的关系
https://www.cnblogs.com/tang321/p/14504409.html 参考
继承(类)/实现(接口)
是一个 is a 。继承就是在原有类A的基础上,新建一个类B,不过新建的类B是在A的基础上,继承父类(A)的属性以及方法。该模式是面相对象的基础。 继承是类的继承,组合是对象的组合
依赖
use a
依赖关系是比关联关系弱的一种关系,是所有关系中最弱的一种,在java语言中体现为返回值,参数,局部变量和静态方法调用。
依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。表现在代码层面,为类B作为参数被类A在某个method方法中使用。在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示。
关联
has a 类作为成员变量被使用
关联(Association),是类与类之间的联接。关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
表现在代码层面,为被关联类B以类的属性形式出现在关联类A中(成员变量),也可能是关联类A引用了一个类型为被关联类B的全局变量(静态变量)。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。
分为单向关联 双向关联 自关联
在这里插入图片描述
自关联
关联之组合
组合(Composition) ,即“contain-a”关系,组合也是关联关系的一种特例,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。
在JAVA中,组合关系一般使用成员变量来实现,组合关系中的成员变量一般会在构造方法中赋值
class People{
Soul soul;
Body body;
//组合关系中的成员变量一般会在构造方法中赋值
Public People(Soul soul, Body body){
This.soul = soul;
This.body = body;
}
Public void study(){
System.out.println(“学习要用灵魂”+soul.getName());
}
Public void eat(){
System.out.println(“吃饭用身体:”+body.getName());
}
}
关联之聚合
有一个 has a
聚合(Aggregation),聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。
聚合关系中作为成员变量的类一般使用set方法赋值
class People{
Car car;
House house;
//聚合关系中作为成员变量的类一般使用set方法赋值
public void setCar(Car car){
This.car = car;
}
public void setHouse(House house){
This.house = house;
}
public void driver(){
System.out.println(“车的型号:”+car.getType());
}
public void sleep(){
System.out.println(“我在房子里睡觉:”+house.getAddress());
}
}
委托 – 六大关系中不包含委托。 有的地方会提到委托这个说法,理解为作为方法参数进行依赖。委托是不想实现继承时的一种解决方案。我不继承你,但是我关联委托你, 我方法的具体实现,都是调用你完成,实现代码复用
六大关系是指 (继承 实现 关联 组合 聚合 依赖)
委托是将一部分功能分割出去完成,即委托者(delegator)将自己委托给受托者(delegatee),受托者方法中参数为委托者对象;然后委托者调用受托者类对象。委托是通过方法参数实现。
组合示例
delegateA {
delegateeB b;
void methodA(); { b.methodB();;}
}
delegateeB {
void methodB(); {}
}
委托示例
delegateA {
delegateeB b;
void methodA(); { b.methodB(this);; }
void do(); {}
}
delegateeB {
void methodB(delegateA a); { a.do();; }
}