软件构造:用接口组合实现面向接口编程并提高代码复用度

在JAVA编程中,我们为了提高代码的复用度和理清各个类的关系,通常采用继承和委托混合使用的编程方式,同时采用接口组合的方式来扩展每个类的行为。这同样有利于我们面对接口编程。

  • 我们可以看一看JAVA中一个经典的动物类对象案例:
    现在我们有一个Animal类,该类只存储某某个动物的名称name,同时只有一个方法eat()。
public class Animal {
	String name;//动物名称
	
	public Animal(String name) {
		this.name=name;
	}

	public void eat() {...}//eat方法
}
  • 有一个鸟类类接口BirdLike,该接口继承接口Flyable,以实现接口组合
public interface BirdLike extends Flyable{
	public void Body();//BirdLike接口定义的方法Body
}

public interface Flyable {
	public void fly();//Flyable接口定义的方法fly
}

  • 再来,我们有一个具体的鸟类Bird实现了接口BirdLike并继承于Animal,其在实现Flyable接口中的fly()方法时将采用委托的形式委托给Flyable的一个具体实现fly1。
//实现了接口BirdLike并继承于Animal
public class Bird extends Animal implements BirdLike {
	Flyable f1;
	public Bird(String name,Flyable f1) {
		super(name);
		this.f1=f1;//存储飞行方法fly1在f1中
	}
	@Override
	public void fly() {
		f1.fly();//委托给f1实现飞行方法
	}
	@Override
	public void Body() {...}
}

//Flyable的一个具体实现fly1
public class Fly1 implements Flyable {
	@Override
	public void fly() {...}
}
  • 现在假设我们在客户端用Animal引用来存储格式各样的动物(不只有Bird类),还要在客户端对各个会飞的动物(都实现了Flyable接口)调用其fly方法(我们通过别的方式判断了每个Animal是否会飞)。那么就可以将每个Animal都强制转化为Flyable引用,就可以实现方法fly()的调用了(因为在Animal引用下,并没有fly()这个方法)。
public void PrintFly(List<Animal> as) {
	for(Animal a:as) {
		((Flyable)a).fly();//转化为Flyable引用,以调用fly方法
	}
}

有人可能会问一个问题:

为什么不直接建一个FlyableAnimal父类(抽象类),让所有会飞的动物都继承FlyableAnimal,改变PrintFly()的参数为FlyableAnimal?
答:上面的方法当然是可行的,而且比上述的逻辑还更好理解。
现在假设现在我们有动物Animal1,Animal2,Animal3。其中Animal1和Animal2的飞行方式相同,但和Animal3不同。那么在我们写好Animal1的fly()方法后,就需要将其复制给Animal2;或者说再增加一个父类F2,让Animal1和Animal2都继承与F2。这些方法同样可行,但是当Animal1和Animal2的其他方法Method1又不同呢?Animal1和Animal3的Method1又相同呢?若像上述的结构编写代码,一旦我们的类关系变得复杂时,上述逻辑虽然简单但具体实现极其复杂。
故我们采用继承加委托的方式来实现,若Animal1和Animal2都有相同的飞行方式,那么就将其具体实现委托给某个Flyable的具体实现即可,这样提高代码的复用度。同时采用我们采用接口组合的方式来实现各个动物类的特性组合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值