当前位置: 首页 > news >正文

【《设计模式之美》】如何取舍继承与组合

文章目录

  • 什么情况下不推荐使用继承?
  • 组合相比继承有哪些优势?
  • 使用组合、继承的时机

本文主要想了解:

  • 为什么组合优于继承,多用组合少用继承。
  • 如何使用组合来替代继承
  • 哪些情况适用继承、组合。
  • 有哪些设计模式使用到了继承、组合。

什么情况下不推荐使用继承?

继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。

但当继承层次过深、过复杂,也会影响到代码的可维护性。在这种情况下,我们应该尽量少用,甚至不用继承。

 

组合相比继承有哪些优势?

可以利用组合(composition)、接口、委托(delegation)三个技术手段,一块儿来解决刚刚继承存在的问题:继承层次过深、继承关系过于复杂会影响到代码的可读性和可维护性。

如下例子:

  1. 接口实现功能的拓展:接口表示具有某种行为特性。接口可以拓展类的行为。
  2. 通过组合和委托技术来消除代码重复。
    在这里插入图片描述

 

替代复杂的继承关系逻辑

我们知道继承主要有三个作用:表示 is-a 关系,支持多态特性,代码复用。而这三个作用都可以通过其他技术手段来达成。

  1. 比如 is-a 关系,我们可以通过组合和接口的 has-a 关系来替代;
  2. 多态特性我们可以利用接口来实现;
  3. 代码复用我们可以通过组合和委托来实现。

所以,从理论上讲,通过组合、接口、委托三个技术手段,我们完全可以替换掉继承,在项目中不用或者少用继承关系,特别是一些复杂的继承关系。


 

使用组合、继承的时机

总体原则

如果类之间的继承结构稳定(不会轻易改变),继承层次比较浅(比如,最多有两层继承关系),继承关系不复杂,我们就可以大胆地使用继承。

反之,系统越不稳定,继承层次很深,继承关系复杂,我们就尽量使用组合来替代继承。

 
相关设计模式
有一些设计模式会固定使用继承或者组合。

在这里插入图片描述
 
我们必须使用继承的场景

如果你不能改变一个函数的入参类型,而入参又非接口,为了支持多态,只能采用继承来实现。

如下:

其中 FeignClient 是一个外部类,我们没有权限去修改这部分代码,但是我们 希望执行encode时按照司内逻辑来进行encode。 这个时候,我们只能采用继承来实现了。
在这里插入图片描述

 
参考:《设计模式之美》王争

http://www.lryc.cn/news/268618.html

相关文章:

  • 一步到位:用Python实现PC屏幕截图并自动发送邮件,实现屏幕监控
  • Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
  • oracle ORA-01704: string literal too long ORACLE数据库clob类型
  • 微星主板强刷BIOS(以微星X370gaming plus 为例)
  • matlab 图像上生成指定中心,指定大小的矩形窗
  • ❀My学习小记录之算法❀
  • Hive-high Avaliabl
  • 码住!8个小众宝藏的开发者学习类网站
  • Postman常见问题及解决方法
  • ubuntu图形化登录默认只有guest session账号解决方法
  • 全国计算机等级考试| 二级Python | 真题及解析(1)
  • Java开发框架和中间件面试题(9)
  • 【ARMv8M Cortex-M33 系列 2 -- Cortex-M33 JLink 连接 及 JFlash 烧写介绍】
  • react pwa应用示例
  • python如何通过日志分析加入黑名单
  • RabbitMq知识概述
  • 专业级A链接测试特有
  • Spring Boot 入参校验及全局异常处理
  • MySQL 和 MySQL2 的区别
  • AutoCAD图纸打印后内容不见
  • ASUS华硕ROG幻16 2023款GU603VU VV VI笔记本电脑原厂Win11.22H2系统
  • 学习笔记 k8s常用kubectl命令
  • 企业数据可视化-亿发数据化管理平台提供商,实现一站式数字化运营
  • 网络通信-Linux 对网络通信的实现
  • mysql修改密码
  • 深入解析C语言中void (*signal(int ,void(*)(int) ) ) (int)
  • 网站显示不安全警告怎么办?消除网站不安全警告超全指南
  • [SWPUCTF 2021 新生赛]finalrce
  • 如何底层调用最快地复制OPC数据到关系数据库
  • 接口测试工具——ApiFox使用初体验 postman导出和ApiFox导入