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

合成复用原则(CRP)

非常好!你已经学习了好几个设计原则,现在我们来讲解合成复用原则(Composite Reuse Principle, CRP)——它和继承是常被比较的一对“重用方式”。


🧠 一句话定义

合成复用原则(CRP)尽量使用“组合/聚合”来实现代码复用,而不是通过继承。


🎯 为什么需要它?

在面向对象中,实现复用有两种方式:

方式举例特点
组合(推荐)类 A 里包含类 B 的对象灵活、低耦合
继承类 A 继承类 B紧耦合、不灵活

我们常说:

继承是“白盒复用”(暴露了内部细节)
组合是“黑盒复用”(只暴露需要的接口)


✅ 优点 vs ❌ 缺点

✅ 优点❌ 缺点
更灵活:运行时可替换组件初期代码稍多
低耦合:不受父类变动影响多一层转发代码
可组合多个能力不如继承简单直观
符合“面向接口编程”思想不熟悉组合的人会嫌“啰嗦”

🐍 Python 示例

❌ 继承复用(不推荐)

class Animal:def eat(self):print("Eating")class Dog(Animal):def bark(self):print("Barking")d = Dog()
d.eat()   # ✅ 复用到了
d.bark()

但如果 Animal 改了,你就可能连 Dog 都出 bug —— 继承让两个类“绑死”了


✅ 合成复用(推荐)

class AnimalBehavior:def eat(self):print("Eating")class Dog:def __init__(self):self.behavior = AnimalBehavior()  # 组合进来def bark(self):print("Barking")def eat(self):self.behavior.eat()  # ✅ 委托给组合对象
  • Dog 拥有 AnimalBehavior 的能力;
  • 如果将来 AnimalBehavior 换成 VeganAnimalBehavior,不用改 Dog 结构;
  • 更灵活、更安全!

🧭 结构图(Mermaid)

has-a 组合
Dog
+eat()
+bark()
AnimalBehavior
+eat()

📦 典型应用场景

  • 游戏角色拥有多个“能力”(组合而非继承)
  • 构建服务时组合多个服务(AuthService, LoggingService)
  • GUI 系统中组件组合成更复杂的 UI(而不是继承出所有种类)

🏁 总结口诀

🧩 能用组合,就别继承!继承是一种“硬绑定”,组合才是“灵活拼装”。


🔁 总结对比:组合 vs 继承

比较项继承组合
耦合度高(父变子崩)低(组合可替)
灵活性固定继承体系可组合多个能力
可替代性强(运行时替换)
设计模式支撑Template MethodStrategy, Decorator 等

如果你希望我用一个真实项目例子(比如:支付系统、角色技能系统、Web Controller组合)来演示「组合复用」的效果,我可以继续带你写一段小实战!

要不要试试看?🚀

http://www.xdnf.cn/news/3799.html

相关文章:

  • IDEA回滚代码操作
  • Windows下调试WebRTC源码
  • BOSS的收入 - 华为OD机试(A卷,C++题解)
  • 昇腾的昇思MindSpore是什么?跟TensorFlow/PyTorch 等第三方框架有什么区别和联系?【浅谈版】
  • c++ 二级指针 vs 指针引用
  • 小土堆pytorch数据加载概念以及实战
  • 【Tauri2】37——后端处理invoke
  • SVM实战:从理论到鸢尾花数据集的分类可视化
  • skynet中的client.socket库函数详解
  • WebRTC 服务器之Janus架构分析
  • 大模型开发的环节
  • AIGC算力消耗白皮书:Stable Diffusion vs Midjourney的架构成本差异
  • 头歌数据库课程实验(索引与数据库完整性)
  • 从零认识阿里云OSS:云原生对象存储的核心价值
  • 解析机器人 2.0.2 | 支持超过50种短视频平台的链接解析,无水印提取,多功能下载工具
  • 华为OD机试真题——智能驾驶(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 什么是函数重载?
  • MySQL 空值处理函数对比:IFNULL、COALESCE 和 NULLIF
  • 《Linux macOS :GCC升级方法》
  • 私人医生通过AI分析基因数据,是否有权提前告知癌症风险?
  • 【AI面试准备】XMind拆解业务场景识别AI赋能点
  • QML图像提供器 (Image Provider)
  • 【Ansible自动化运维实战:从Playbook到负载均衡指南】
  • 【算法基础】插入排序算法 - JAVA
  • 怎样增加AI对话的拟人化和增加同理心
  • WEB前端小练习——记事本
  • 先知AIGC超级工场,撬动运营效率新杠杆
  • 在 Trae CN IDE 中配置 Python 3.11的指南
  • Nat. Hum. Behav:大脑“变形记”,注意力错误下的空间认知奇遇
  • 如何解决 403 错误:请求被拒绝,无法连接到服务器