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

使用组合聚合的方式来代替继承,第1张

在设计模式原则中有“组合/聚合复用原则”,结合网上的相关资料和文章,得出自己个人的理解并在此记录下。
首先,我们要明确为什么要使用组合/聚合的方式来代替继承?
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();//开汽车行走

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/924055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存