美文网首页
设计模式:组合、接口、委托替代继承

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

作者: 陈萍儿Candy | 来源:发表于2020-08-27 21:43 被阅读0次

针对“会飞”这样一个行为特性,我们可以定义一个 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(); // 委托
  }
}

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

相关文章

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

    针对“会飞”这样一个行为特性,我们可以定义一个 Flyable 接口,只让会飞的鸟去实现这个接口。对于会叫、会下蛋...

  • C++面向对象设计

    组合、委托、继承 一、composition(组合)has-a 1 组合关系(Adapter 设计模式) 关系: ...

  • 使用 Kotlin 委托(Delegation) 实现 Andr

    委托模式(代理模式)是一种常见的设计模式,委托模式使得我们可以用聚合来替代继承,将委托者与实际实现代码分离出来,以...

  • Kotlin面向对象之委托(Delegation)

    类委托(Class Delegation) 委托模式(也叫作代理模式),该模式已经被证明是继承的一个很好的替代方案...

  • Java设计模式:代理模式

    Java设计模式——代理模式 代理模式主要分为接口,委托类,代理类 接口:规定具体方法委托类:实现接口,完成具体的...

  • HeadFirst设计模式-策略模式

    设计原则:1) 封装变化的部分 2) 针对接口编程,而不是针对实现变成 3)多用组合,少用继承 设计模式: 策略模...

  • 结构性模式(二):装饰器、外观模式

    1、装饰器模式(Decorator Pattern) 装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承...

  • 编程模式·小结

    常见编程模式小结 继承 & 组合复用代码,两者都可以继承有多态效果,满足“里氏代换原则”设计上最好用单继承多接口(...

  • Java接口

    抽象类,抽象方法 接口 策略设计模式 适配器模式 多继承 接口的继承 接口中的域 接口与工厂

  • Kotlin 委托模式用于 Android 开发

    委托模式被证明是一种很好的替代继承的方式,Kotlin 在语言层面对委托模式提供了非常优雅的支持(语法糖)。 先给...

网友评论

      本文标题:设计模式:组合、接口、委托替代继承

      本文链接:https://www.haomeiwen.com/subject/kyvhsktx.html