开闭原则与依赖倒置原则区别:原类不变,新增类(功能)vs 接口类不变,原实现类可变
好,我来用最通俗的方式,用角色扮演 + 场景对话,不讲术语,让你彻底明白「依赖倒置原则」和「开闭原则」的区别。
🎭 场景:你是老板(高层),你要雇人做事
一、【依赖倒置原则】像是:
你(老板)不直接招某个具体的人,而是找中介说:我要一个会画画的人。
- ✅ 你不管是“张三”来画,还是“李四”来画;
- ✅ 你只要求:对方能实现
画画()
这个动作; - ✅ 换人不需要你改流程。
关键词:我不依赖“某个人”,我只依赖“会画画”这个能力。
二、【开闭原则】像是:
你以后要多做几种事,比如画画 + 写代码 + 做策划,你不重写流程,而是新增岗位。
- ✅ 原来的“画画流程”不动;
- ✅ 新建一个“写代码岗位”,加入就行;
- ✅ 老流程一点不动。
关键词:我不动旧流程,只新增角色就能扩展能力。
🧠 总结用词(极简版)
术语 | 本质 | 类比 |
---|---|---|
依赖倒置原则 | “我不找人,我找能力” | 老板说:我只找‘会干活的人’ |
开闭原则 | “我不改旧流程,我加新流程” | 老板说:原来只画画,现在再加个写代码的人 |
🧪 用 Python 再演一遍
✅ 依赖倒置原则
class Person(ABC):@abstractmethoddef work(self): passclass Painter(Person):def work(self): print("🎨 画画")class Coder(Person):def work(self): print("💻 写代码")class Boss:def assign_work(self, p: Person):p.work()# 老板不关心你是谁,只管你会不会 work()
boss = Boss()
boss.assign_work(Painter()) # 输出:🎨 画画
boss.assign_work(Coder()) # 输出:💻 写代码
你看,Boss(高层)只看接口,不依赖具体类。
✅ 开闭原则
class Person(ABC):@abstractmethoddef work(self): passclass Painter(Person):def work(self): print("🎨 画画")# 以后加新需求,不改 Painter,只加新类
class Coder(Person):def work(self): print("💻 写代码")
原来的 Painter 类没动,新增 Coder 类就能拓展功能,开闭原则 ✅
🎯 最后用最简单话讲两者区别
问题 | 依赖倒置原则解决 | 开闭原则解决 |
---|---|---|
“我要和谁合作?” | 和接口合作,不直接找具体人 | ✅ |
“我以后要加功能怎么办?” | 不改原代码,扩展新模块 | ✅ |
“我要换人怎么办?” | 换人不换流程(只要接口兼容) | ✅ |
如果你还迷糊,不妨这样记:
依赖倒置 = 找能力;开闭原则 = 加人干新活。
需要我再用一个小游戏、支付系统、或微服务场景帮你「角色扮演实战」吗?讲起来会更容易理解~