优先使用对象组合,而不是类继承

2023-11-07

http://www.cnblogs.com/nexiyi/archive/2013/06/16/3138568.html

《极限编程》(Extreme programming)的指导原则之一是“只要能用,就做最简单的”。一个似乎需要继承的设计常常能够戏剧性地使用组合来代替而大简化,从而使其更加灵活。因此,在考虑一个设计时,问问自己:“使用组合是不是更简单?这里真的需要继承吗?它能带来什么好处?”

继承和组合的比较:
  面向对象系统中功能复用的两种最常用技术是 类继承对象组合(object composition)。正如我们已解释过的,类继承允许你根据其他类的实现来定义一个类的实现。这种通过生成子类的复用通常被称为 白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,父类的内部细节对子类可见。
  对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为 黑箱复用(black-box reuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。
        继承和组合各有优缺点。类继承是在编译时刻静态定义的,且可直接使用,因为程序设计语言直接支持类继承。类继承可以较方便地改变被复用的实现。当一个子类重定义一些而不是全部操作时,它也能影响它所继承的操作,只要在这些操作中调用了被重定义的操作。
        但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了部分子类的具体表示。因为继承对子类揭示了其父类的实现细节,所以继承常被认为“ 破坏了封装性” 。子类中的实现与它的父类有如此紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,实现上的依赖性就会产生一些问题。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。一个可用的解决方法就是只继承抽象类,因为抽象类通常提供较少的实现。
        对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。组合要求对象遵守彼此的接口约定,进而要求更仔细地定义接口,而这些接口并不妨碍你将一个对象和其他对象一起使用。这还会产生良好的结果:因为对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来替代另一个对象;更进一步,因为对象的实现是基于接口写的,所以实现上存在 较少的依赖关系
  对象组合对系统设计还有另一个作用,即 优先使用对象组合有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。另一方面,基于对象组合的设计会有更多的对象 (而有较少的类),且系统的行为将依赖于对象间的关系而不是被定义在某个类中。
  这导出了我们的面向对象设计的第二个原则: 优先使用对象组合,而不是类继承

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优先使用对象组合,而不是类继承 的相关文章

  • Python 第一章 基础知识(6) 函数

    函数就像可以用来实现特定功能的小程序一样 Python的很多函数都能做很奇妙的事情 先来介绍一个内建函数 即是Python自带的已经定义好的函数 可以直接用 gt gt gt pow 2 3 8 这个函数实现了2 2 2的算法 这种使用函数
  • SourceTree 总是提示 git credential manager

    解决 1 使用sourcetree内嵌的git 还不行的话更新下版本 2 仓库设置里面加上用户名密码 格式 http 用户名 密码 xxx git
  • Java 程序员应该了解的 10 个面向对象设计原则

    http www iteye com news 24488 面向对象设计原则是OOPS Object Oriented Programming System 面向对象的程序设计系统 编程的核心 但大多数Java程序员追逐像Singleton
  • 设计一算法,将已建立的单链表进行逆置

    单链表逆序有很多种方法 可是好多种方法都是逆序后就不能再使用之前定义的函数了 因为你的头结点变动了 不再是之前所定义的first或是head了 所以之前的方法都要重写 后来我终于想到了种很好的方法了 为了不重开空间 我们可以就在原来的那个单
  • 用代码生成Glitch Art风格的抖音字体

    最近看到不少文章教大家用 photoshop 实现抖音的 logo 跟字体 我也非常喜欢这种风格的字体 于是趁着晚上的时间 动手用代码实现了下此类风格的字体特效 顺便开发了个小工具 地址见文末 本文主要是从 艺术手法 和 JS 前端 实现
  • 免费的插画素材网站有哪些?

    面对紧急设计项目 设计师会选择使用外力来完成项目 免费插图网站可以帮助我们在这个时候解决问题 但大多数插图网站都是收费的 需要版权或特别丑陋的 基本上很少有免费的没有版权的好插图 但今天我想推荐一个免费的插图网站 即时设计资源社区 即时设计
  • 【设计模式】软件设计遵循——六大原则

    软件设计遵循 六大原则 1 开闭原则 定义 一个软件实体如类 模块和函数应该对扩展开放 对修改关闭 原则 用抽象构建框架 用实现扩展细节 优点 提高软件系统的可复用性和可维护性 2 里氏替换原则 定义 所有引用基类的地方必须能透明化地使用其
  • 推荐的自动标注工具

    之前研究了Android AutoLayout的使用 不过项目开发过程中提供的设计图往往没有标注完整的UI 这时候需要开发工程师自己搞定了 于是搜索并尝试了一下 找到一些方便的自动标注工具 同时作下记录 方便后来者借鉴与使用 一 一套免费的
  • 优先使用对象组合,而不是类继承

    http www cnblogs com nexiyi archive 2013 06 16 3138568 html 极限编程 Extreme programming 的指导原则之一是 只要能用 就做最简单的 一个似乎需要继承的设计常常能
  • 探究:秒杀系统

    1 秒杀系统的特点 瞬时高并发 2 预防措施 2 1 流量限制 对于一个相同的用户 限制请求的频次 对于一个相同的IP 限制请求的频次 验证码 减缓用户请求的次数 活动开启之前 按钮先置灰 防止无效的请求流入系统 给系统造成冲击 2 2 页
  • 面向对象设计的SOLID原则

    S O L I D是面向对象设计和编程 OOD OOP 中几个重要编码原则 Programming Priciple 的首字母缩写 SRP The Single Responsibility Principle 单一责任原则 OCP The
  • 一个完整的产品设计都要哪些设计流程

    设计理念是抽象的 它描述了一个产品从概念到完成的一般过程 然而 真正的产品设计过程要复杂得多 也要具体得多 因此 我们将分解这个过程中最重要的部分 并给实践中使用的建议 1 设计前期 通常 设计过程的第一步在产品设计之前就已经开始了 这是因
  • App6种常见的数据加载设计

    设计师在进行APP设计的设计时 往往会更加专注于界面长什么样 界面和界面之间怎么跳转 给予用户什么样的操作反馈 却偏偏特别容易忽略掉一个比较重要的环节 就是APP数据加载中的设计 所以会导致我们看到的APP 往往有着华丽的启动界面 然后就是
  • 学习笔记(01):MySQL数据库从入门到搞定实战-DDL之数据库

    立即学习 https edu csdn net course play 27328 362512 utm source blogtoedu SQL 结构化查询语言 用于访问和操作数据库 主要包括数据定义 数据操纵 数据查询和数据控制 DDL
  • 【数电】如何使用74LS112(或74LS74)构成一个十四分频器(模七计数器)

    IT精英们 大家都学过数字电子技术吧 尽管这东西没用 不过这些基础课程对思维的培养还是很有好处的 我不爱上课 但不代表我不喜欢数电 我们实验课老师为了加强实验难度 把实验题改掉了 用74LS112 或者74LS74 设计一个十四分频器 原来
  • 动态菜单/权限管理的实现

    权限管理 序 现在基本上大大小小的系统都由权限分配这一基础功能 不同的用户看到的界面不一样 能够使用的功能也不会尽然相同 所以我要让我的系统做到超级管理员可以看到 操作所有界面 而新闻管理员只能看到新闻管理模块 仓库管理员只能看到仓库管理模
  • 白盒测试(程序流程图)

    白盒测试又称结构测试 透明盒测试 逻辑驱动测试或基于 代码的测试 白盒测试是一种 测试用例设计方法 盒子指的是被测试的 软件 白盒指的是盒子是可视的 你清楚盒子内部的东西以及里面是如何运作的 白盒 法全面了解程序内部逻辑结构 对所有逻辑路径
  • 设计模式C++学习笔记之二(Proxy代理模式)

    http www cnblogs com wanggary archive 2011 04 08 2009965 html 代理 一看名字就知道这只是个中介而已 真实的执行者在代理的后面呢 cbf4life在他的书里提的例子也很有趣 更详细
  • Photoshop、Illustrator、Sketch哪个更好

    以前在交流组经常能看到大家争论哪个设计软件好 到底是你的吗 Illustrator好还是我的CorelDRAW或者他的Photoshop强大 但是跟着UI流行的设计 Sketch软件也加入了争论 让我们和你分享一下这篇文章 让我们来看看平面
  • 电脑快速打开计算器的方法

    大家好 我是爱你三千遍斯塔克 我们平常在运算时 经常要要使用计算器 那么计算器有什么快速打开方法吗 这里有一些参考方法 可供大家进行参考 希望对大家有帮助 希望你喜欢我的内容 记得关注我哦 我会继续为大家带来更好的作 1 win R 打开运

随机推荐

  • Spark 总结项目一---报错:bigger than spark.driver.maxResultSize

    七 spark集群报错 bigger than spark driver maxResultSize 难点 报错代码 20 09 15 15 21 32 ERROR scheduler TaskSetManager Total size o
  • Android Small插件化框架--启动插件Activity源码解析(下)

    转自 http m blog csdn net article details id 53158432 参考博文 http www tuicool com articles EjEJNrJ http m w2bc com article 1
  • 四、基础数据结构和算法:简单排序算法

    4 简单排序算法 4 1 冒泡排序 4 1 1 步骤 方式1 首先实现一趟冒泡排序 单趟冒泡排序将数组内最大值放到arr n 1 的位置 void bubble int arr int n for int i 0 i lt n 1 i if
  • 第5章 K8s基础篇-基本概念

    01 master节点 举个栗子 你启动3个nginx 副本 此时你想扩容至5个 输入完对应命令后 kube apiserver会通通知cm cm实施具体的容器扩缩容操作 02 Node节点 查看kube proxy工作模式 iptable
  • 如何用matplotlib绘制柱状图,并显示超出坐标范围的数据

    最近在处理数据 为了方便展示 需要绘制柱状图进行可视化 数据类似对数正态分布 即数据值越接近均值 数据越多 反之距离均值越远 数据量越少 形式类似于下图 可以看到 大部分数据落在0 10以内 大于10的部分我们不太关心 import num
  • linux下获取本机IPv6地址、前缀、网关

    获取本机IPv6信息命令 cat proc net if inet6 root IT PC 135 home user1 cat proc net if inet6 fe80000000000000922b34fffe4e70f4 02 4
  • libmodbus学习(一)之Modbus RTU-master

    一 Modbus 协议 Modbus簇主要有三种协议 Modbus RTU Modbus ASCII Modbus TCP 工控行业通常的设备组网看 三者应用的范围如下 三者模型区别如下 如上图所示 串行传输的物理层是RS 485或RS 2
  • datagrid传参_12. ajax、datagrid请求传参实例

    实例1 var data data orgRoleCode orgRoleCode data orgRoleName orgRoleName data containRoleIds containRoleIds data remark re
  • 1-问过 chatgpt 的问题(天马行空想问什么问什么)

    这里写目录标题 一 复数的极坐标形式是什么 如何求它的相位角 二 信号分解方法 2 1 了解 Fourier decomposition method 方法吗 具体解释一下它的原理 并给出一些参考文献 2 2 我说的FDM算法是出自 The
  • Unity3D项目程序加密——对dll进行混淆

    这里假设我们在Unity3D里面写的代码抽象成这样一个Test类 里面包含了公开和私有的变量 有自带的Start方法 Update方法和OnGUI方法 还有public private和protected方法 虽然说用抽象类代表了项目里面实
  • MySQL导入与导出.sql文件实操

    你是否对获得MySQL导入与导出 sql文件的实际操作感到无语 如果是这样子的话 此文将会给你相应的解决方案 以下的文章主要是介绍获得MySQL导入与导出 sql文件 的方案 以下就是相关内容的具体描述 一 MySQL的命令行模式的设置 桌
  • c++基础

    C 浅谈 闲暇之际 一直想把自己那些零碎的知识给连贯起来 形成一个体系 所以才决定写点东西来整理下最近半年来的知识点 我想把自己的知识输出才是最高效的学习方法 本博客讲结合我自己本人的实际工作经验 进行浅谈 与诸君分享 共同进步 由于能力有
  • idea java 阿里巴巴_AS 阿里巴巴Java开发规约 CheckStyle-IDEA

    Alibaba Java Coding Guidelines 简介 Alibaba Java Coding Guidelines 是阿里巴巴发布的基于 IDEA 的 Java 开发规约扫描插件 经过247天的持续研发 阿里巴巴于10月14日
  • Jmeter使用教程

    一 Jmeter介绍 二 Jmeter安装教程 1 下载地址 安装之前首先配置Java环境变量 Apache JMeter Download Apache JMeter 根据自己电脑系统来选择合适的安装包即可 2 环境变量配置 配置Jmet
  • java基础:成员变量与局部变量

    java中的变量 在java语言中 根据定义变量的位置不同 可以将变量分为两大类 一类是成员变量 一类是局部变量 由于二者之间存在很大的区别 所以在此介绍 1 成员变量 在类中定义的变量 分为类变量和实例变量两种 在定义类变量的时候 没有s
  • 神经网络学习小记录75——Keras设置随机种子Seed来保证训练结果唯一

    神经网络学习小记录75 Keras设置随机种子Seed来保证训练结果唯一 学习前言 为什么每次训练结果不同 什么是随机种子 训练中设置随机种子 学习前言 好多同学每次训练结果不同 最大的指标可能会差到3 4 这样 这是因为随机种子没有设定导
  • Taro小程序获取DOM元素 - Kaiqisan

    拖更一个月 抱歉 露出肚皮 主要是过年 考研复习 最近没时间写博客 就分享下最近写的项目遇到的问题 观前提示 本篇文章所有内容基于Taro React typescript 我会尽量敲一遍ts代码再敲一遍js代码 快夸我贴心 快o o 并且
  • 一、项目总体介绍以及环境配置

    项目总体介绍以及环境配置 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 例如 第一章 Python 机器学习入门之pandas的使用 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 项目总体介
  • springboot - 自定义配置类

    拿datasource举栗子 package com example demo config import com alibaba druid pool DruidDataSource import com example demo pro
  • 优先使用对象组合,而不是类继承

    http www cnblogs com nexiyi archive 2013 06 16 3138568 html 极限编程 Extreme programming 的指导原则之一是 只要能用 就做最简单的 一个似乎需要继承的设计常常能