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