使用组合/聚合的方式来代替继承

本文探讨了为何在设计模式中应优先使用组合/聚合而非继承,主要原因是降低耦合度和提高灵活性。组合允许在运行时动态调整对象行为,而聚合则在对象创建时不立即创建相关对象,提供了更大的灵活性。通过示例代码展示了组合和聚合的具体实现,如在类中组合飞机和船类,以及人类类如何聚合交通工具接口的不同实现。
摘要由CSDN通过智能技术生成

在设计模式原则中有“组合/聚合复用原则”,结合网上的相关资料和文章,得出自己个人的理解并在此记录下。
首先,我们要明确为什么要使用组合/聚合的方式来代替继承?
1、降低耦合度,子类通过继承父类,可以达到代码重用的目的。但同时也意味着子类必须全盘继承父类的属性和方法,不需要的属性和方法继承会造成污染,当父类的方法变更时也会影响到子类。因此,出于降低代码耦合的角度考虑,应该避免直接继承有具体方法实现的父类。
2、提高灵活性,由于java单继承的特点,无法同时使用多个类的特征,通过在类中创建不同工具类的方式,可以实现对不同类的调用。子类重写的父类方法,实现的都是一种静态的复用。不能在运行时发生改变,灵活性比较差。如果在子类中创建所需的工具类对象,则可以在使用过程中调用相关的类,以此提高代码的灵活性。

在清楚了为什么要用组合/聚合的方式来代替继承之后,接下来我们再来明确下组合与聚合的概念以及区别:

1、组合方式:A类的构造方法里创建B类的对象,也就是说,当A类的一个对象产生时,B类的对象随之产生。
在这里插入图片描述

2、聚合方式:A类的对象在创建时不会立即创建B类的对象,而是等待一个外界的对象传给它。
在这里插入图片描述
最后看一下这两种方式的具体实现:

组合

class Plane{
	public void fly(){}
}
class Ship{
	public void swim(){}
}
class ManKind {
	private Plane p = new Plane();
	private Ship s = new Ship();
	public void fly(){
		p.fly();
	}
	public void swim(){
		s.swim();
	}
}

聚合

//交通工具接口
interface Vehicle{
	public  void run();
}
//自行车实现类
class Bike implements Vehicle{
	public void run(){
		System.out.println("骑单车行走");
	}
}
//汽车实现类
class Car implements Vehicle{
	public void run(){
		System.out.println("开汽车行走");
	}
}
//人类
class CDMan {
	private Vehicle  v;
	public void run(){
		v.run();
	}
//更换交通工具
	public void changeVehicle(Vehicle  v){
		this.v = v;
	}
}
……
CDMan c = new CDMan();
c.changeVehicle(new Bike());
c.run();//骑单车行走
c.changeVehicle(new Car());
c.run();//开汽车行走
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值