一文让你学会“合成复用原则”,不会你来找我!

10.合成复用原则——面向对象设计原则 合成复用原则是面向对象设计原则的 7 条原则中剩下的最后一条,下面我们将对其进行详细地介绍。 合成复用原则的定义 合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。 如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。 阅读详情

菜鸟有句话想说:“加不加班的不重要,我只是比较喜欢晚上公司门口的路灯。”

在这里插入图片描述

今天跟大家分享一下,设计模式七大原则中的“合成复用原则”。该原则阐述的是,我们应该如何复用类。

讲“合成复用原则”之前先来聊一聊类的“复用”。复用类我们可以通过“继承”和“合成”两种方式来实现。

这两种方式中,“继承”相信大家都比较了解,我们就先看一下继承的优缺点。

继承的优点:

容易实现并且容易修改和扩展继承来的内容。

继承的缺点:

它最大的缺点就是增加了类之间的依赖,当父类发生改变时,其子类也会被动发生改变。并且子类继承来的实现是静态的,在代码编译时期已经定义好的,在运行时是不可以发生变化的。
还有就是继承是属于“白箱”复用,父类对子类来说是透明的,这破坏了类的封装性。

在这里插入图片描述

介于继承存在的这些缺点,我们在复用类时,要优先考虑使用“合成”进行复用。

合成复用简介:

1、合成复用原则的核心思想是:在编写代码时如果需要使用其它类,那么两个类之间尽量使用合成/聚合的方式,而不是使用继承。
2、合成复用原则,传递的一种设计思路就是:我们可以通过类之间的“合成”来达到“复用”代码的诉求。

合成复用的好处就是解决了使用继承带来的缺点,我就不在此进行赘述。

任何事物有好就有坏,这是必然的。合成复用存在的缺点就是在系统中会存在较多的对象需要管理。

还有一点需要注意:不是不使用继承,而是尽量先考虑使用“合成”复用,其次在考虑使用“继承”复用。

说了这么多“合成复用原则”的理论性知识,那到底我们应该怎样应用在代码中呢?请看下面的示例。

在这里插入图片描述

案例:假设有A、B两个类。B类需要复用A类的方法。

通过“合成复用原则”来实现上述案例(不再展示继承复用)。

方式一: 使用简单依赖。在B类中添加方法,方法入参使用A类。

// 测试类
public class Test {

  public static void main(String[] args) {
    B b = new B();
    b.methodB(new A());
  }
}
// A类
class A {

  public void methodA() {
    System.out.println("A类的方法执行了。");
  }
}
// B类
class B {

  public void methodB(A a) {
    System.out.println("B类的方法执行了。");
    a.methodA();
  }
}

使用“简单依赖”的执行结果:

在这里插入图片描述

方式二: 把A类聚合到B类中。在B类中添加属性,类型为A类,通过set方法进行初始化。

// 测试类
public class Test2 {

  public static void main(String[] args) {
    B b = new B();
    System.out.println("使用聚合的执行结果:");
    b.setA(new A());
    b.methodB();
  }
}
// A类
class A {

  public void methodA() {
    System.out.println("A类的方法执行了。");
  }
}
// B类
class B {

  private A a;

  public A getA() {
    return a;
  }

  public void setA(A a) {
    this.a = a;
  }

  public void methodB() {
    System.out.println("B类的方法执行了。");
    this.a.methodA();
  }
}

使用“聚合”的执行结果:

在这里插入图片描述

方式三: 把A类组合到B类中。在B类中添加属性,类型为A类,并直接new出来。

public class Test3 {

  public static void main(String[] args) {
    B b = new B();
    System.out.println("使用组合的执行结果:");
    b.methodB();
  }
}

class A {

  public void methodA() {
    System.out.println("A类的方法执行了。");
  }
}

class B {

  private A a = new A();

  public void methodB() {
    System.out.println("B类的方法执行了。");
    this.a.methodA();
  }
}

使用“组合”的执行结果:

在这里插入图片描述

以上就是使用“合成复用原则”的一些基本知识。切记合成复用原则向我们传达的设计理念是:优先考虑使用“合成”复用,其次在使用“继承”,并不是不使用“继承”。 继承也是有其优点的。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。

在这里插入图片描述

12个小时带你掌握设计模式! 设计模式概论 为什么要学习设计模式 众所周知,面向对象编程(OOP)是编程中的一个重要思想。基于此,计算机学界诞生了一大批术语:类、继承、多态、虚方法等,一大批面向对象的语言C++、java、C#也开始大放异彩。 目前大多数工科院系都开设面向对象编程(C++)课程。不少同学在学习这门课时也许会遇到和我一样的疑惑:我懂得类、继承、虚函数的使用规则,但是这样做到底有什么实在的好处呢?如果仅仅学习C++的语法,我们是不能深刻体会面向对象的优越性的,这样学到的东西只能称之为"C with class"。而要想真正理 阅读详情

相关推荐

手把手教你用Matlab/Simulink搭建PMSM的SMO无感FOC仿真(附相位补偿与离散化代码)

本文详细介绍了基于滑模观测器(SMO)的永磁同步电机(PMSM)无传感器FOC控制方法,通过Matlab/Simulink平台实现从理论到实践的完整流程。内容涵盖SMO核心原理、离散化处理、转子位置估算与相位补偿技术,以及双闭环控制系统搭建,为工程师提供了一套完整的无传感器控制解决方案。

weixin_27038245的博客 255

设计模式七大原则---合成复用原则

设计模式 c++ 合成服用原则

jiyanghao19的博客 1646

OAI数据集申请下载全攻略:从个人NDA账号注册到数据包下载的保姆级避坑指南

本文提供OAI数据集申请下载的完整指南,涵盖从个人NDA账号注册到数据包下载的全流程。重点解析login.gov验证陷阱、浏览器兼容性问题、NDA权限申请技巧及nda-tools高效使用方法,帮助医学影像研究者避开常见技术障碍,快速获取全球骨关节炎研究数据库OAI的宝贵数据资源。

weixin_28698059的博客 752

【设计模式】合成复用原则

合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的。

qq_53662373的博客 1818

S32DS3.5图形化配置实战:从零构建S32K144通信接口工程

本文详细介绍了如何使用S32DS3.5图形化配置工具从零构建S32K144通信接口工程。通过实战演示引脚配置、时钟树设置、SPI接口搭建等关键步骤,帮助开发者快速掌握NXP S32K系列开发技巧,提升嵌入式开发效率。特别针对S32DS3.5版本的新特性进行了深度解析,包括智能代码生成和调试优化方法。

weixin_26834815的博客 200

基于DSP28335的Matlab/Simulink代码生成实验七:A/D采样

实验七:讲解如何使用DSP的ADC模块,通过代码生成技术控制DSP进行电流采样,是后续实现电机闭环控制的重要环节。通过简单的实验来熟悉代码生成的过程。最终实现复杂算法代码自动生成,进行高性能电机控制!

m0_73869369的博客 4725

合成复用原则

合成复用原则是面向对象设计中的基本原则之一,通过优先使用组合或聚合而不是继承,可以提高系统的灵活性和可维护性。在实际开发中,遵循合成复用原则有助于我们设计出高质量的代码,使系统更加稳定和易于扩展。希望这个博客对你有所帮助。如果你有任何问题或需要进一步的例子,请随时告诉我!

qq_42798343的博客 1232

记录:MCGS和正弦变频器通讯

触摸屏实现对变频器:启动、停止、频率设定、频率读取、电压读取、电流读取。通讯方式Modbus RTU。

m0_61837027的博客 1026

7.合成复用原则

文章目录一、定义二、分析1.合成复用原则概述2.复用的两种基本方法2.1 继承复用2.2 组合\聚合复用2.3注意事项三、实例1.解释名称2.引出问题3.合成复用原则重构 一、定义   合成复用原则又称为组合\聚合复用原则,其定义如下: 尽量使用对象组合,而不是继承来达到复用的目的。 二、分析 1.合成复用原则概述   合成复用原则就是指在一个新的对象里通过 关联关系(包括组合关系和聚合关系) 来使用一些已有的对象,使之成为新对象的一部分;   新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言

qq_43403759的博客 2081

【AI编程】Trae 环境搭建与配置从使用到项目实战详解

Trae 环境搭建与配置从使用到项目实战详解

congge 5652

生成模型实战 | StyleGAN详解与实现

StyleGAN 能够生成非常高分辨率人脸图像的关键在于,在增加分辨率的步骤中逐步增加生成网络和判别网络的复杂性,以便在每一步中,两个模型都可以很好地完成任务。我们学习了如何通过确保每个分辨率的特征由一个独立的输入(称为风格向量)来控制,从而操纵生成图像的风格,以及如何通过将图像之间的风格进行交换来操作不同图像的风格。

盼小辉丶的博客 7631

Java设计进阶部分的总结,你们都学会了吗?

点击蓝字 关注我们在软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的解决方案。换句话说,设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计的经验的总结。使用设计模式...

实验楼 161

mapbox高阶,加载倾斜摄影

本文详细介绍如何基于mapbox-gl v3.8.0版本实现倾斜摄影的加载,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 345

5分钟学会java设计模式及设计原则

java设计模式及设计原则 一、前言 时间飞逝,一晃三个月未执笔了;突然明白不写博客的自己,学习也懈怠了。... 步入正题,从今天开始以及在接下来的日子里,我会将 java23种常见模式以及七大设计原则进行学习总结; 设计模式是...

猿医ˉ生 2055

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式1 设计原则

七大设计原则 文章目录七大设计原则单一职责原则接口隔离原则依赖倒转原则里氏替换原则开闭原则OCP迪米特法则-最少知道原则合成复用原则核心思想 目的:代码重用性,可读性,可扩展性,可靠性—高内聚,低耦合。 单一职责原则 对类来说,一个类应该只负责一项职责。 降低类的复杂度 提高类的可读性,可维护性 降低变更引起的风险 只有逻辑足够简单,才可以在代码级别违反此原则;只有类的方法数量足够少,才可以在方法级别保持此原则。 接口隔离原则 类不应依赖它不需要的接口,即一个类对另一个类的依赖应该建立在

qq_38207878的博客 135

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【设计模式前置课】软件设计的七原则

【设计模式前置课】软件设计的七原则设计模式为啥要学设计模式七大原则1. 开闭原则2. 里氏替换原则3. 依赖倒置原则4. 单一职责原则5. 接口隔离原则6. 最少知道原则7. 合成复用原则最后BB两句七大设计原则设计模式-创建型模式设计模式-结构性模式设计模式-行为型模式参考文章 写了几个 Java 项目后发现自己的代码 和 Github 上其他大佬差的太多太多,后来才发现,仅仅学会 Java 的语法是远远不够的,如果 学了 前人总结好的 设计模式,代码的风格和实用性 会有很大的提升。 设计模式 学

韩旭051的博客 779

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式七大设计原则

文章目录设计模式七大设计原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则-最少知道原则单一职责原则合成复用原则 设计模式 面向对象的三个基本特征: 继承 封装 多态 设计模式体现了代码的耦合性、内聚性、可维护性、可扩展性、重用性、灵活性。 代码重用性:相同功能代码不用多次编写 可读性 可扩展性:添加新功能非常方便,可维护 可靠性:当我们添加新功能不影响原有的功能 使程序呈现高内聚、低耦合的特性 七大设计原则 开闭原则 原则:一个软件实体如类、模块、函数应该对拓展开发、对修改关闭 在程序需要

dreamzuora的博客 347

[JAVA学习笔记] 21天学习挑战赛第二周 面向对象编程(五)OO设计原则

学习面向对象已经一周了,对面向对象的结构体系有一个初步的认识,已经了解了Java编程的一些基础知识,可以去动手编程了;但是,学会了OO基础并不代表这能设计出良好的OO系统,今天先简单介绍一下面向对象编程第二步——OO设计原则。...

qq_50531508的博客 447

代理设计模式还不会?2分钟搞定

概述代理模式就是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。例如电脑桌面的快捷方式就是一个代理对象,快捷方式是它所引用的程序的一个代理。代理模式一般又分为安全代理,虚拟代理 ,远程代理。类图需求老王想邀请马冬梅喝酒,抽烟,穿JK,但老王不善言谈,有点羞涩,只能让其秘书出面邀请,最后...

dotNET跨平台 162

重温设计模式(为了找工作,在没写完23种模式之前,我会持续更新)

文章目录1:设计模式初探1.1:什么是设计模式1.2 设计模式原则1、开闭原则(Open Close Principle)2、里氏代换原则(Liskov Substitution Principle)3、依赖倒转原则(Dependence Inversion Principle)4、接口隔离原则(Interface Segregation Principle)5、单一职责原则(Single Res...

宋宇超的博客 401

01设计原则--七大设计原则

01设计原则--七大设计原则 设计原则   定义 使用频率 单一职责原则     一个类只负责一个功能领域中的相应职责 ★★★★ 开闭原则      软件实体应对扩展开放,而对修改关闭   ★★★★★ 里氏代换原则     所有引用基类对象的地方能够透明地使用其子类的对象 ★★★★★ 依赖倒转原则 抽象不应依赖

疯子博客 296

如何成为Android高手

“天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。”想成为Android高手?这可不是想象中写几行代码那么容易的事情,但也不是不可实现。          1,学会懒惰!奇怪吧?但是,你一定也听说过和感受过这个世

hgl868的专栏 1187

学会这些 (设计模式) 我竟然找到了女朋友

文章目录Java设计模式软件设计模式概述GoF 的 23 种设计模式的分类和功能UML中的类图及类图之间的关系什么才是优秀的软件架构?如何正确使用设计模式?开闭原则——面向对象设计原则里氏替换原则——面向对象设计原则依赖倒置原则——面向对象设计原则单一职责原则——面向对象设计原则接口隔离原则——面向对象设计原则迪米特法则——面向对象设计原则合成复用原则——面向对象设计原则一句话总结软件设计七大原则创建型模式的特点和分类单例模式(单例设计模式)原型模式(原型设计模式)简单工厂模式工厂方法模式抽象工厂模式建造者

weixin_47982485的博客 311

续三,用RecyclerView来实现苹果后台样式的卡片布局

继续承接之前论述。前面已经对几个UI的实现做了分析,最后点评一下程序中所用的设计模式吧。程序设计模式对于程序来说很重要。可以说,程序设计模式是一个程序的灵魂。 设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的

rj113的专栏 618

002-面向对象设计原则

面向对象设计原则是构建高质量软件的基础,主要包括SOLID五大原则和其他重要原则。SOLID原则包含:单一职责原则(类应只有一个职责)、开闭原则(对扩展开放,对修改关闭)、里氏替换原则(子类可替换父类)、接口隔离原则(避免臃肿接口)和依赖倒置原则(依赖抽象而非实现)。其他原则如迪米特法则(减少对象耦合)和合成复用原则(优先组合而非继承)。这些原则指导开发者设计出可维护、可扩展、可复用和可测试的代码结构,是设计模式的理论基础。通过合理应用这些原则,可以显著提升代码质量,降低系统复杂度。

wyl703的博客 881

设计模式七大原则

这七大原则的核心目标就是:让你的代码更灵活、更稳定、更容易修改和扩展,就像一个设计精良、管理有序的工厂,每个部门各司其职(单一职责),新生产线能轻松加入(开闭),新员工能无缝替换老员工(里氏替换),员工手册清晰明确(接口隔离),老板只看报表不插手细节(依赖倒置),部门间沟通高效不越级(迪米特法则),设备模块化可插拔(合成复用)。遵循这些原则,你的“代码工厂”就能高效、稳定地运转!通俗解释能用“组装”(has-a)就别用“继承”(is-a),优先使用组合。生活例子错误继承:你想造一辆“消防车”。

weixin_63108234的博客 967
上一篇: 面试官:这年轻人讲的“迪米特法则”有那么点东西
下一篇: 优秀的程序员怎么能不知道类是何时被加载进虚拟机的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值