依赖,关联,聚合,组合之间的关系

依赖,关联,聚合,组合是在学习面向对象最容易混淆的知识点,但是对于软件工程的学生来说这也是一个必须掌握的知识点。
对我来说刚开始接触这个的时候,就觉得非常的抽象,很难以理解,在前后花费了一定的时间后,自己觉得还是对他们之间有了一点感悟,然后就想写一篇博客分享一下。主要会结合Power Designer画图。
主要参考了这位大佬的博客,
他的文章地址:
java–依赖、关联、聚合和组合之间区别的理解
后面的例子是我自己想的。

先解释一下,接下来关系中涉及到的耦合性的意思,耦合性的意思是类和类之间的联系是否紧密,如果两个类之间耦合性较强,则这两个类之间关系紧密,一个改动后,另一个也可能要做相应变动。
一个程序中,如果一个类和其他很多类的耦合性都很高,那么我们改动了这个类,则其他的类很有可能也得发生改动,所以我们一般希望类之间的耦合性越小越好。

依赖:A类使用了于B类,他们之间的关系不是一种稳定的关系,只有A类调用B的方法时B才会被临时创建。
比如,一个人(Person类)他要去住房子,所以在这个时候才会去创建一个房子(House类),再去调用House的方法。在他不住房子的时候,就不会去使用House的方法,所以就不会去创建一个House的实例。
所以我们可以理解成为这是租房子,只有需要的时候才会去租一个房子,不要的时候就不租这个房子了,这个房子就消失了。
在 代码 上可以理解为一个类需要另一个类的实例作为他自己的局部变量,或者是形式参数。
举个例子:

//这是被依赖的类,是上面定义中说的B类
Class House{
	public static void live(){
		System.out.println("我是一个小房子。")
	}
}

//这是A类    他需要依赖B类
Class Person{
	//使用形参产生 “依赖”
	public void live_house1(House house){
		house.live()
	}
	//使用局部变量发生依赖关系   
    public void live_house2(){   
        House house = new House();   
        house.live();   
    }   
    //使用静态变量发生依赖关系   
    public void live_house3(){   
        House.live();  
    }   
}

在这里插入图片描述

关联:关联比依赖的耦合性更高,如果说A类关联B类,A类和B类此时是一种拥有的关系,B类一般是作为A类的成员变量的。当然,有些时候也可以是形式参数作为“关联”对象。
比如,我自己有一套房子,我拥有这套房子。(相对应地,依赖是租房子)
(关联也可以这样理解,他的本质是消息的传递,也就是调用别的类的方法。)
举个例子:

//这是被依赖的类,是上面定义中说的B类
Class House{
	public static void live(){
		System.out.println("我是一个小房子。")
	}
}

//这是A类    他需要依赖B类
Class Person{
	//成为自己的成员变量
	House house = new House();
	
	public void live_house(){
		this.house.live()
	}  
}

在这里插入图片描述

依赖和关联的区别
依赖属于那种更短暂的使用关系,在java中的体现就是:1.形参,局部变量,静态变量;
关联是那种更加稳定的拥有关系,在java中的体现就是:成员变量。


聚合是一种强耦合性的特殊“关联”关系,在java中也是用成员变量表示。
整体和部分的生命周期不同步。所以在成员变量初始化时,不赋初值或者赋值为null,这样整体和部分创建时间不同,所以他们生命周期也就自然不同。(java中变量回收是通过java虚拟机进行,所以一般在java中比较生命周期主要指的是创建的时间点)
就比如:学生和班级的关系,当学生在上学的时候,学生是班级中的一份子,当学生毕业了以后,班级解散了,但是学生还是存在的。
在这里插入图片描述
在java代码也是作为成员变量存在。

Class Student{
	public void introduceMyself(){
		System.out.println("我是一个学生。")
	}
}

Class Class_{
	//成为自己的成员变量
	Student student = null;//在属性初始化时不赋一个固定的初值,(或赋值为null)
	//所以Student不是在Class_生成的时候被生成的,
	//他们创建的时间都不同,则他们的生命周期不同
	public Class_(Student student){
		//在这里调用 构造方法 的时候再传入参数赋值
		//意味着这个"部分对象Student"是之前就已经创建出来的,
		//student创建的时间跟class对象不同,则生命周期student自然和class不同
		this.student = student;
	}
	
	public void introduceStudent(){
	//调用自己成员变量对应的方法		
		this.student.introduceMyself();
	}  
}

组合是一种相对“聚合”耦合性更强的特殊“关联”关系。
他要求普通的“聚合”关系中代表整体的对象负责代表部分对象的生命周期。
比如:房子和房间,房子存在的时候房间是房子的一部分,但是当房子塌了之后,房间也随之消亡了。
在这里插入图片描述
在java代码也是作为成员变量存在。

Class Room{
	public void buildRoom(){
		System.out.println("一个房间被生成。")
	}
}

Class House{
	//成为自己的成员变量
	House house = new House();//在属性初始化时赋初值
	//所以当Main类中创建House时,Room也会立刻一起被生成
	//又因为java中回收是虚拟机完成,所以只考虑创建点是否相同
	//来决定他们生命周期是否相同
	//多说一句,因为这里的Room被直接固定死了,所以Room这个属性是
	//无法给别的House共享的,
	//是专属于这个House对象的
	//这样耦合性就比较高,并且这样House如果想要创建另一个房间
	//还要重写构造方法,比较麻烦,
	//所以一般不用“组合”来进行构造对象
	
	public void buildHouse(){
		this.room.buildRoom();//直接调用room的方法
		//而不用再次声明变量了
	}  
}

聚合组合 和 普通关联的区别?
两个类之间是普通关联,则类之间是平级的关系,没有从属关系;
而两个类之间是聚合或者组合 关系,则类之间是包含的关系;(比如:学校包含了学院,椅子包含了四条椅子腿)
组合聚合多了一个条件:类之间需要相同的生命周期。
这里引用一句参考博客中大佬的总结:
关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段java代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。

以上就是自己的一些收获和感悟,不一定完全准确,但是希望能对你理解面向对象的这几种关系有所帮助。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值