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

设计模式中继承和组合的总结

一、什么是继承

继承就是子类继承父类的特征和行为,使得子类具有和父类一样的属性和方法,在Java中通过extends关键字来实现继承。

优点

  1. 继承最大的好处是可以代码复用。针对多个类有相同的属性和方法,可以将这些相同代码抽取出来形成统一父类,后续只需要继承该父类就能使用这些属性和方法,可以避免代码冗余,实现代码复用。
  2. 继承能实现多态特性。继承父类的方法,子类可以根据自己的需求重写父类方法,这是Java的多态带来的便利。
  3. 继承模式表明的是is-a关系,表明子类是父类的一种类型,可以用来约束父类和子类的关系。

缺点

  1. 类间的层次变深会影响代码的可读性和可维护性。当类间的层次达到3层或3层以上时,需要确定自身类的属性和方法就会比较麻烦。
  2. 子类会继承了父类的所有属性和方法,即使没有使用也会继承,容易造成自身属性的膨胀。

二、什么是组合

组合是对现有对象进行拼装组合实现更复杂的功能,在Java中通过引用其他的类做自身的属性实现类间的组合。

优点

  1. 组合模式表明的是has-a的关系,表明自身这个类包含其他类的关系。
  2. 继承的特性可以通过组合、接口、委托三个技术手段来达成。除此之外,利用组合还能解决层次过深、过复杂的继承关系影响代码可维护性的问题。
  3. 组合的层级关系更少,类间的耦合性更低,便于代码维护和阅读。

缺点

  1. 将继承改为组合,意味着需要进行更细粒度的拆分,势必会产生更多的类和接口,类的数量增加会增加代码维护成本。

三、总结

  1. 面向对象程序的设计原则是:组合优于继承,多用组合少用继承。
  2. 但在实际的开发过程中,需要根据具体情况来选择继承还是组合:当类间的关系层次较浅(不多于3层),类间的联系也比较稳定,建议采用继承的模式,否则采用组合的模式更好。

    本文由博客一文多发平台 OpenWrite 发布!

相关文章:

  • MyString字符串类
  • TOGAF(企业架构)
  • VSCode snippets
  • Android11系统桌面隐藏指定APP图标
  • nginx请求时找路径问题
  • NetSuite数据备份办法
  • Day 11 python学习笔记
  • Linux系统下配置王爽汇编语言环境
  • SQL注入原理及思路(mysql)
  • 【ChatGPT系列】ChatGPT:创新工具还是失业威胁?
  • 导入Embassy库进行爬虫
  • 上海高考英语科目命题趋势和备考建议,附1990-2023真题解析
  • 网络安全—小白自学
  • 磨人的Ts
  • java中的内存分配
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2017前端实习生面试总结
  • Angular2开发踩坑系列-生产环境编译
  • C# 免费离线人脸识别 2.0 Demo
  • JS实现简单的MVC模式开发小游戏
  • Laravel Telescope:优雅的应用调试工具
  • laravel5.5 视图共享数据
  • linux安装openssl、swoole等扩展的具体步骤
  • mockjs让前端开发独立于后端
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node和express搭建代理服务器(源码)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • 初识MongoDB分片
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • ------- 计算机网络基础
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用权重正则化较少模型过拟合
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 数据科学 第 3 章 11 字符串处理
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 终端用户监控:真实用户监控还是模拟监控?
  • 国内开源镜像站点
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​学习一下,什么是预包装食品?​
  • # Java NIO(一)FileChannel
  • #14vue3生成表单并跳转到外部地址的方式
  • #if #elif #endif
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (007)XHTML文档之标题——h1~h6
  • (9)STL算法之逆转旋转
  • (MATLAB)第五章-矩阵运算
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (五)网络优化与超参数选择--九五小庞
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Linux整合apache和tomcat构建Web服务器