开闭原则与依赖倒置原则区别:原类不变,新增类(功能)vs 接口类不变,原实现类可变

好,我来用最通俗的方式 ,用角色扮演 + 场景对话不讲术语,让你彻底明白「依赖倒置原则」和「开闭原则」的区别。


🎭 场景:你是老板(高层),你要雇人做事


一、【依赖倒置原则】像是:

你(老板)不直接招某个具体的人,而是找中介说:我要一个会画画的人

  • ✅ 你不管是"张三"来画,还是"李四"来画;
  • ✅ 你只要求:对方能实现 画画() 这个动作;
  • ✅ 换人不需要你改流程。

关键词:我不依赖"某个人",我只依赖"会画画"这个能力。


二、【开闭原则】像是:

你以后要多做几种事,比如画画 + 写代码 + 做策划,你不重写流程,而是新增岗位

  • ✅ 原来的"画画流程"不动;
  • ✅ 新建一个"写代码岗位",加入就行;
  • ✅ 老流程一点不动。

关键词:我不动旧流程,只新增角色就能扩展能力。


🧠 总结用词(极简版)

术语 本质 类比
依赖倒置原则 "我不找人,我找能力" 老板说:我只找'会干活的人'
开闭原则 "我不改旧流程,我加新流程" 老板说:原来只画画,现在再加个写代码的人

🧪 用 Python 再演一遍

✅ 依赖倒置原则

python 复制代码
class Person(ABC):
    @abstractmethod
    def work(self): pass

class 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(高层)只看接口,不依赖具体类


✅ 开闭原则

python 复制代码
class Person(ABC):
    @abstractmethod
    def work(self): pass

class Painter(Person):
    def work(self): print("🎨 画画")

# 以后加新需求,不改 Painter,只加新类
class Coder(Person):
    def work(self): print("💻 写代码")

原来的 Painter 类没动,新增 Coder 类就能拓展功能,开闭原则 ✅


🎯 最后用最简单话讲两者区别

问题 依赖倒置原则解决 开闭原则解决
"我要和谁合作?" 和接口合作,不直接找具体人
"我以后要加功能怎么办?" 不改原代码,扩展新模块
"我要换人怎么办?" 换人不换流程(只要接口兼容)

如果你还迷糊,不妨这样记:

依赖倒置 = 找能力;开闭原则 = 加人干新活。


需要我再用一个小游戏、支付系统、或微服务场景帮你「角色扮演实战」吗?讲起来会更容易理解~

相关推荐
进击的CJR1 天前
MySQL 8.0 OCP 英文题库解析(八)
数据库·mysql·开闭原则
进击的CJR4 天前
MySQL 8.0 OCP 英文题库解析(六)
数据库·mysql·开闭原则
进击的CJR4 天前
MySQL 8.0 OCP 英文题库解析(七)
mysql·adb·开闭原则
进击的CJR5 天前
MySQL 8.0 OCP 英文题库解析(五)
数据库·mysql·开闭原则
进击的CJR10 天前
MySQL 8.0 OCP 英文题库解析(三)
android·mysql·开闭原则
软件不硬12 天前
OCP开闭原则
开闭原则
z263730561113 天前
六大设计模式--OCP(开闭原则):构建可扩展软件的基石
设计模式·开闭原则
gjc59213 天前
MySQL OCP试题解析(3)
数据库·mysql·开闭原则
gjc59214 天前
MySQL OCP试题解析(2)
android·数据库·mysql·开闭原则
博睿谷IT99_15 天前
MySQL OCP 认证限时免费活动 7 月 31 日 前截止!!!
数据库·mysql·开闭原则