面向对象设计原则——合成复用原则

2023-11-07

        合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, C/ARP),定义:尽量使用对象组合,而不是继承来达到复用的目的。

        合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用功能的目的。简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承。

        在面向对象设计中,可以通过两种方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承,但首先应该考虑使用组合/聚合,组合/聚合可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。

        通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称“白箱”复用,如果基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;而且继承只能在有限的环境中使用(如类没有声明为不能被继承)。

        由于组合或聚合关系可以将已有的对象(也可称为成员对象)纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能,这样做可以使得成员对象的内部实现细节对于新对象不可见,所以这种复用又称为“黑箱”复用,相对继承关系而言,其耦合度相对较低,成员对象的变化对新对象的影响不大,可以在新对象中根据实际需要有选择性地调用成员对象的操作;合成复用可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的其他对象。

        一般而言,如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承。"Is-A"是严格的分类学意义上的定义,意思是一个类是另一个类的"一种";而"Has-A"则不同,它表示某一个角色具有某一项责任。

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

面向对象设计原则——合成复用原则 的相关文章

  • 面向对象设计原则

    面向对象设计原则是设计模式的基础 xff0c 每一个设计模式都符合某一个或者多个面向对象设计原则 xff0c 面向对象设计原则是用于评价一个设计模式的使用效果的重要指标之一 单一职责原则 一个对象应该只包含单一的职责 xff0c 并且该职责
  • 里氏替换原则——面向对象设计原则

    在上一节 开闭原则 中 xff0c 我们详细介绍了开闭原则 xff0c 本节我们来介绍里式替换原则 里氏替换原则的定义 里氏替换原则 xff08 Liskov Substitution Principle xff0c LSP xff09 由
  • 依赖倒置原则——面向对象设计原则

    前两节我们详细介绍了面向对象设计原则中的开闭原则和里氏替换原则 xff0c 在本节中我们来介绍依赖倒置原则 依赖倒置原则的定义 依赖倒置原则 xff08 Dependence Inversion Principle xff0c DIP xf
  • JavaScript的一些设计原则

    1 单一职责原则 SRP 单一职责原则通常指 一个类只有一种功能 但是JavaScript是一门面向对象的语言 没有类的概念 所以单一职责在JavaScript中的含义是 一个对象 方法 只有一种功能 那么为什么需要单一职责原则呢 是因为不
  • 产品设计七大定律

    Alan Cooper 交互设计之父 除非有更好的选择 否则就遵从标准 许多设计准则都基于人类心理学 人们如何感知 学习 推理 记忆 以及把意图转换为行动 菲茨定律 菲茨定律用来预测某点到目标位置所需要时间的数学模型 在页面中 大而近的目标
  • 设计模式——合成复用原则

    文章目录 合成复用原则 设计原则核心思想 合成案例 聚合案例 继承案例 优缺点 合成复用原则 原则是尽量使用合成 聚合的方式 而不是使用继承 设计原则核心思想 找出应用中可能需要变化之处 把它们独立出来 不要和那些不需要变化的代码混在一起
  • 六大设计原则--迪米特法则【Low Of Demeter】

    声明 本文内容是从网络书籍整理而来 并非原创 定义 迪米特法则也叫做最少知识原则 Least Knowledge Principle 指一个对象应该对其他对象有最少的了解 通俗的讲 一个类对自己需要耦合或者调用的类应该知道的最少 你类内部是
  • 深入理解设计原则之KISS/YAGNI/DRY原则【软件架构设计】

    系列文章目录 C 高性能优化编程系列 软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 如果敌人使你生气 说明你没有胜过他的信心 If the enemy makes you angry that means you have
  • OCP开-闭原则

    概念 开闭原则由Bertrand Meyer 于1988年提出 是指软件应该对扩展开放 对修改关闭 OCP开闭原则的动机 软件是变化的 OCP说明了软件设计应该尽可能地使架构稳定而又容易 满足不同的需求 软件设计本身所追求的目标就是封装变化
  • 开放-封闭原则(The Open-Closed Principle)

    1 定义 软件实体 类 模块 函数等等 应该是可以扩展的 但是不可修改的 开放 封闭原则主要体现在两个方面 对扩展开放 意味着有新的需求或变化时 可以对现有代码进行扩展 以适应新的情况 对修改封闭 意味着一旦设计完成 就可以独立完成其工作
  • JavaScript设计模式——工厂模式

    在介绍工厂模式之前 首先我们要理解一下什么是设计模式 什么是设计原则 设计模式 通常在我们解决问题的时候 很多时候不是只有一种方式 我们通常有多种方式来解决 但是肯定会有一种通用且高效的解决方案 这种解决方案在软件开发中我们称它为设计模式
  • C++面向对象设计原则学习笔记

    原则一 依赖倒置原则 DIP 高层模块 稳定 不应该依赖于底层模块 变化 二者都应该依赖于抽象 稳定 抽象 稳定 不应该依赖于实现细节 变化 实现细节应该依赖于抽象 稳定 原则二 开放封闭原则 OCP 对外扩展开放 对更改封闭 类模块应该是
  • 面向对象设计原则——合成复用原则

    合成复用原则又称为组合 聚合复用原则 Composition Aggregate Reuse Principle C ARP 定义 尽量使用对象组合 而不是继承来达到复用的目的 合成复用原则就是在一个新的对象里通过关联关系 包括组合关系和聚
  • Java设计模式之七大设计原则

    Java设计模式之七大设计原则 本文对Java设计模式中的七大设计原则进行汇总介绍 提炼最核心的概念 设计模式总结笔记 一 设计模式七大原则 设计模式的目的 代码可重用性 相同功能的代码 不用多次编写 可读性 编程规范性 便于其他程序员的阅
  • 面向对象设计原则——单一职责原则

    单一职责原则是最简单的面向对象设计原则 它用于控制类的粒度大小 单一职责原则 Single Responsibility Principle SRP 一个类只负责一个功能领域中的相应职责 或者可以定义为 就一个类而言 应该只有一个引起它变化
  • 面向对象设计原则——里氏代换原则

    里氏代换原则 Liskov Substitution Principle LSP 所有引用基类 父类 的地方必须能透明地使用其子类的对象 里氏代换原则告诉我们 在软件中将一个基类对象替换成它的子类对象 程序将不会产生任何错误和异常 反过来则
  • 面向对象设计的重要原则:SOLID

    SOLID是面向对象设计5大重要原则的首字母缩写 1 单一职责原则 SRP 2 开放封闭原则 OCP 3 里氏替换原则 LSP 4 接口隔离原则 ISP 5 依赖倒置原则 DIP 下面具体解释一下每个原则 1 单一职责原则 SRP 表明一个
  • 开放封闭原则的理解与具体实现 C#Unity

    目录 前言与文章介绍 一 概念阐释 1 什么是开放封闭 2 开放封闭原则怎么实现 2 1 基本思路 2 2 具体方法 二 运用原则的实例说明 实现解释 实例总结 三 相关链接 前言与文章介绍 文章将先阐释开放封闭原则 然后将理论运用于实践
  • 深入理解设计原则之组件构建原则【软件架构设计】

    系列文章目录 C 高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 困难只能吓倒懦夫懒汉 而胜利永远属于攀登高峰的人 Difficulties can only be intimidated by a
  • 六大设计原则--开闭原则

    定义 software entities like classes modules and functions should be open for extension but closed for modifications 一个软件实体

随机推荐

  • 删除流氓360首页

    不管你使用什么浏览器都很容易中招360给你自动设置的流氓首页 流氓厂石锤了 你在浏览器设置新的首页一样无效 比如 完全没有卵用 以前这样是可以生效的 最近几天突然不行了 这简直流氓的不行 而且 细心会发现 右键浏览器图标 属性 快捷方式这能
  • 2023JavaWeb面试问答_MyBatis

    谈谈你对 MyBatis 的理解 Mybatis是一个半ORM 对象关系映射 框架 它内部封装了 JDBC 开发时只需要关注 SQL 语句本身 不需要花费精力去处理加载驱动 创建连接 创建 Statement 等繁杂的过程 程序员直接编写原
  • 从程序员到等保测评师,多亏这个决定看到了希望

    做程序员的一年后 加班成隐 头秃了不说 感觉没有奔头 女朋友也不知道在哪里 一不小心公司后台被攻击崩溃了整夜加班是常事 解决不了少不了挨批 总之程序员太难了 我丧失了对未来的希望 后来因为公司一次攻击事件 有幸和测评机构的等保测评师探讨了一
  • Arduino PID 控制教程

    参考 在控制系统中 控制器在出现错误和干扰时将特定系统的输出校正为所需的输入 最流行的控制器类型是PID 它是P运动 异构和D的缩写 在这个Arduino PID控制教程中 我将告诉你如何在你的项目中使用这样的控制器 应用PID代码 5个重
  • 学习cocos2d-x之路(4)--实现Hero在各个方向移动

    为了实现在4个方向Hero的运动 创建枚举变量 typedef enum keyDown 0 keyLeft 1 keyUp 2 keyRight 3 HeroDirection 注意 此处枚举变量的设置要按照英雄图片中的方向设置 需要定义
  • 浅谈Chrome开发者工具--- Console面板与常见报错类型

    Console面板 在学习JS之后 Console面板就成了我离不开的工具 在我们的程序无法达到我们所期望的效果时候 就可以在Console面板上调试我们的程序 在面板上 除了报错以外 还可以打印出我们在程序中所想要补货到的一些数据 我用的
  • npm脚本命令npm run script的使用

    npm 可以在项目package json里面自定义脚本命令 package json文件 script dev webpack w package json文件中的字段script的每一个属性都是一个自定义的脚本命令 在命令行中可以通过执
  • pyinstaller no module named ‘pkg_resources.py2_warn‘解决方法

    在用pyinstaller打包python编写好的程序时 遇到了一些问题 其中有一个是no module named pkg resources py2 warn 经过一些探索后 找到了解决方法 1 先用pyinstaller D F xx
  • 二叉树的中序遍历算法(Java三种实现方法)

    文章目录 题目 一 二叉树的节点定义 二 三种遍历方法 1 递归 算法思想 2 迭代 算法思想 3 Morris 中序遍历 算法思想 总结 题目 给定一个二叉树的根节点 root 返回它的 中序 遍历 一 二叉树的节点定义 public c
  • Linux 使用 Qt 和Occ,报错 qcoreevent.h X.h

    因为
  • [蓝桥杯][2013年第四届真题]危险系数

    题目 题目链接 题解 DFS 蓝桥杯中 一般看到图不是BFS就是DFS 代码1对应第一种方法 我的方法 根据关键点的定义 删除这个点之后 无法实现从u到v 那么我们就枚举每个点作为删除点 判断删除这个点之后还能不能实现从u到v 若不能说明删
  • 文献调研(九):基于rough set理论和深度学习算法的建筑能耗预测模型

    A building energy consumption prediction model based on rough set theory and deep learning algorithms Energy and Buildin
  • H5适配iPhoneX底部小黑线,CSS一招搞定!

    做移动端H5的同学 在你的前端开发生涯中 是否遇到过这种问题 浮在手机屏幕底部的功能区 在你的安卓和苹果的大部分机型上展示极其完美 这种 可是在iPhone上却是这种 遇到这样的情况 不要着急 不用js 不用vue css一招教你轻松搞定
  • 探索深度学习世界:掌握PyTorch,成为AI领域的行家

    探索深度学习世界 掌握PyTorch 成为AI领域的行家 PyTorch的背景介绍 PyTorch的基本概念与特点 PyTorch的基本应用 张量和自动求导 神经网络搭建 训练和测试模型 模型的保存和加载 模型保存 模型加载 模型使用 Py
  • idea开启热部署

    一 开启IDEA的自动编译 静态 具体步骤 打开顶部工具栏 File gt Settings gt Default Settings gt Build gt Compiler 然后勾选 Build project automatically
  • 【Java笔记+踩坑】SSM整合

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 SSM整合入门案例 图书的增删改查 1 1
  • ebtables介绍

    ebtables是与iptables类似的命令 区别在于ebtables用于对以太网帧的过滤 iptables用于对ip数据包的过滤 过滤流程见图 原图来源于 http blog csdn net wuruixn article detai
  • 力扣刷题——数组(2)

    将每个元素替换为右侧最大元素 给你一个数组 arr 请你将每个元素用它右边最大的元素替换 如果是最后一个元素 用 1 替换 完成所有替换操作后 请你返回这个数组 示例 输入 arr 17 18 5 4 6 1 输出 18 6 6 6 1 1
  • 网络基础:ACL与NAT

    目录 一 理论 1 ACL 2 NAT 二 实验 1 基础ACL 2 高级ACL 3 静态NAT 4 Easy IP 一 理论 1 ACL 1 ACL ACL 是Access Control List的简写 中文名称叫做 访问控制列表 它是
  • 面向对象设计原则——合成复用原则

    合成复用原则又称为组合 聚合复用原则 Composition Aggregate Reuse Principle C ARP 定义 尽量使用对象组合 而不是继承来达到复用的目的 合成复用原则就是在一个新的对象里通过关联关系 包括组合关系和聚