java接口取代继承,设计模式:组合、接口、委托替代继承

针对“会飞”这样一个行为特性,我们可以定义一个 Flyable 接口,只让会飞的鸟去实现这个接口。对于会叫、会下蛋这些行为特性,我们可以类似地定义 Tweetable 接口、EggLayable 接口。我们将这个设计思路翻译成 Java 代码的话,就是下面这个样子:

public interface Flyable {

void fly();

}

public interface Tweetable {

void tweet();

}

public interface EggLayable {

void layEgg();

}

public class Ostrich implements Tweetable, EggLayable {//鸵鸟

//... 省略其他属性和方法...

@Override

public void tweet() { //... }

@Override

public void layEgg() { //... }

}

public class Sparrow impelents Flayable, Tweetable, EggLayable {//麻雀

//... 省略其他属性和方法...

@Override

public void fly() { //... }

@Override

public void tweet() { //... }

@Override

public void layEgg() { //... }

}

接口只声明方法,不定义实现。也就是说,每个会下蛋的鸟都要实现一遍 layEgg() 方法,并且实现逻辑是一样的,这就会导致代码重复的问题。那这个问题又该如何解决呢?

我们可以针对三个接口再定义三个实现类,它们分别是:实现了 fly() 方法的 FlyAbility 类、实现了 tweet() 方法的 TweetAbility 类、实现了 layEgg() 方法的 EggLayAbility 类。然后,通过组合和委托技术来消除代码重复。具体的代码实现如下所示:

public interface Flyable {

void fly();

}

public class FlyAbility implements Flyable {

@Override

public void fly() { //... }

}

//省略Tweetable/TweetAbility/EggLayable/EggLayAbility

public class Ostrich implements Tweetable, EggLayable {//鸵鸟

private TweetAbility tweetAbility = new TweetAbility(); //组合

private EggLayAbility eggLayAbility = new EggLayAbility(); //组合

//... 省略其他属性和方法...

@Override

public void tweet() {

tweetAbility.tweet(); // 委托

}

@Override

public void layEgg() {

eggLayAbility.layEgg(); // 委托

}

}

如果类之间的继承结构稳定(不会轻易改变),继承层次比较浅(比如,最多有两层继承关系),继承关系不复杂,我们就可以大胆地使用继承。反之,系统越不稳定,继承层次很深,继承关系复杂,我们就尽量使用组合来替代继承

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值