继承缺点
继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。在这种情况下,我们应该尽量少用,甚至不用继承.
使用组合替换继承
继承主要有三个作用:表示 is-a 关系,支持多态特性,代码复用。而这三个作用都可以通过组合、接口、委托三个技术手段来达成。

设计一个关于鸟的类,使用组合、接口、委托完成

定义为一个抽象类 AbstractBird,麻雀、鸽子、乌鸦等,都继承这个抽象类。由于不是所有鸟都会飞,所以不是所有鸟都有fly()这个方法。
我们可以从鸟会不会飞、会不会叫来对鸟进行划分。两个行为搭配起来会产生四种情况:会飞会叫、不会飞会叫、会飞不会叫、不会飞不会叫。如果假如新行为,我们可能还需要继续构建更加细分的抽象类,这样就比较麻烦。继承层次过深、继承关系过于复杂会影响到代码的可读性和可维护性。
可以利用组合(composition)、接口、委托(delegation)三个技术手段解决这个问题。
接口表示具有某种行为特性:
可以定义一个 Flyable 接口,只让会飞的鸟去实现这个接口。
对于会叫、会下蛋这些行为特性,我们可以类似地定义 Tweetable 接口、EggLayable 接口。
1、定义接口

public interface Flyable { void fly();
}
public interface Tweetable { void tweet();
}
public interface EggLayable { void layEgg();
}

2、通过多个接口实现多个特性:鸵鸟不会飞,但是会叫会下蛋,所以只有两个接口。注意,mplements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 。

public class Ostrich implements Tweetable, EggLayable {//鸵鸟 //... 省略其他属性和方法... @Override public void tweet() { //... } @Override public void layEgg() { //... }
}

3、接口只声明方法,不定义实现。也就是说,每个会下蛋的鸟都要实现一遍 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(); // 委托 }
}

由于对Java不太熟悉,可能还需要关注一下这个知识点:
extends和implements区别

【设计模式之美】<Reading Notes>继承与组合相关推荐

  1. 【Java设计模式 面向对象设计思想】五 多用组合少用继承编程

    我们经常会听到说多用组合少用继承,但是拜托,继承是面向对象四大特性之一啊,为什么地位反不如组合了呢,为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承?围绕这三个问题进行以下讨论 ...

  2. 设计模式一网打尽,40余篇文章带你领略设计模式之美

    文章末尾附带GitHub开源下载地址. 该文章的最新版本已迁移至个人博客[比特飞],单击链接 设计模式一网打尽,40余篇文章带你领略设计模式之美 | .Net中文网 访问. 设计模式概述 20世纪80 ...

  3. 设计模式之美总结(结构型篇)

    title: 设计模式之美总结(结构型篇) date: 2022-12-21 09:59:11 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...

  4. 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美(下)https://www.yuque.com/zcming123/uygxde/cbwnad 这位猿,三连,再走吧! 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的 ...

  5. 设计模式之美总结(设计原则篇)

    title: 设计模式之美总结(设计原则篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...

  6. 设计模式之美总结(创建型篇)

    title: 设计模式之美总结(创建型篇) date: 2022-11-03 13:58:36 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...

  7. 设计模式之美总结(面向对象篇)

    title: 设计模式之美总结(面向对象篇) date: 2022-10-11 17:02:54 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...

  8. 设计模式之美总结(重构篇)

    title: 设计模式之美总结(重构篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover.p ...

  9. 设计模式之美-王争-极客时间-返现24元 限时优惠

    极客时间出品的<设计模式之美>由王争所作,王争是前Google工程师手把手教你写高质量代码 前Google工程师,<数据结构与算法之美>专栏作者.本专栏前Google工程师手把 ...

最新文章

  1. Android操作系统11种传感器介绍
  2. RSA加密算法——密码学笔记(四)
  3. Angular 事件绑定语法在 SAP Spartacus Popover Component 中的一个应用
  4. 如何在画面中摆放大量图片
  5. 集合与泛型集合与键值对集合
  6. python画子图_Python使用add_subplot与subplot画子图操作示例
  7. dazhilu网站代码【完整篇】
  8. 失去循环标记的Python,我这样实现跳出外层循环
  9. python3 slice
  10. ASP.NET 4.0尚未在 Web 服务器上注册 解决方法
  11. 配置 iSQL*Plus
  12. 【UE4】UE4GamePlay架构
  13. SQL 数据库基础知识点
  14. TCP和UDP的区别
  15. Android中打开浏览器更新App的最新版本
  16. zip压缩大于4g文件linux,linux下解压大于4G文件提示error: Zip file too big错误的解决办法...
  17. 比起高性能计算,高端存储才更亟待国产化
  18. html选课系统制作,校园选课系统的制作方法
  19. 【转】用 Go 构建一个区块链
  20. LTE中的CQI RI PMI参数

热门文章

  1. oracle catalog命令,db2 catalog tcpip 命令咨询?
  2. uniapp踩坑指南之坑多到写不完
  3. php vprintf,vprintf - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  4. 小程序在父组件执行子组件方法,可适用于下拉刷新上拉加载之后执行子组件方法
  5. 分享轮子-flutter下拉刷新上拉加载
  6. 美团扫码付的前端可用性保障实践
  7. 前端HTML以及HTML5(基本标签)
  8. poj2032Square Carpets(IDA* + dancing links)
  9. 统计数组中重复元素个数
  10. [EffectiveC++]item34:区分接口继承和实现继承