← 每日面试题 学习看板

设计模式的7大基本原则有哪些?

面试题/02架构设计题/09设计模式/设计模式的7大基本原则有哪些?.md

面试记录 2026-09-28

题目:设计模式的7大基本原则有哪些?

难度:difficulty/high

标签:arch/design-pattern, architecture/design, general/knowledge, difficulty/high

评分:⭐⭐☆☆☆(2/5)

我的回答

设计模式的七大基本原则,开闭原则。想不起来了,我就记得对修改关闭,对继承开放开闭原则,然后是还有啥呀?

点评

优点:

不足(严重):

补充(7 大原则完整清单,必须背下来):

#原则缩写一句话
1单一职责原则SRP一个类只做一件事
2开闭原则OCP对修改关闭,对扩展开放
3里氏替换原则LSP子类能替换父类且程序逻辑不变
4依赖倒置原则DIP面向接口编程,都依赖抽象
5接口隔离原则ISP客户端不应被迫依赖不用的接口
6合成复用原则CRP优先组合,而不是继承
7迪米特法则LOD最少知识原则,只和直接的朋友谈

SOLID 五大原则速记:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察对面向对象设计原则的系统掌握,特别是 SOLID 五大原则的完整理解和工程应用。

知识点拆解:

  1. SOLID 五大原则(核心中的核心):
  1. 另外两个补充原则:
  1. 每个原则的典型违反案例:
  1. "扩展"到底是什么(回答 OCP 时要能答):
  1. 原则之间的关系:

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 开闭原则的"扩展"具体指哪些方式?策略模式和模板方法哪种更符合开闭原则?
  1. 里氏替换原则和接口隔离原则经常冲突,如何解决?
  1. 单一职责和迪米特法则如何在实践中落地?有什么反例?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,设计模式的 7 大基本原则我一般分成两组来记,核心是 SOLID 五大原则,另外补充合成复用原则和迪米特法则。

SOLID 五大原则:

第一,单一职责原则 SRP(Single Responsibility):一个类只做一件事,一个类只承担一个引起变化的原因。反例是一个类里既有 CRUD 又有导出 Excel 又有权限校验,应该拆。实际落地方法是给类起个"能一句话说清的职责名",如果名字里出现"和"字(如 User 和 Order Service),大概率违反 SRP。

第二,开闭原则 OCP(Open/Closed):对修改关闭,对扩展开放,新增功能不改老代码。这个"扩展"具体有几种方式:继承子类新增方法、接口 + 策略新增实现类、注解 + 反射匹配、模板方法覆写钩子、装饰器动态增强。反例是加个"信用卡支付"要改 Pay 方法里的 if-else,应该用策略模式,加个 CreditCardPay implements Pay。

第三,里氏替换原则 LSP(Liskov Substitution):子类能替换父类出现且程序逻辑不变,子类不能违反父类契约。反例是 Rectangle 继承 Shape,但子类覆写方法时抛异常,破坏了父类契约。这个原则是继承的健康保障。

第四,接口隔离原则 ISP(Interface Segregation):客户端不应被迫依赖不用的接口,接口要小而专。反例是 OrderService 接口同时有 create/cancel/export/notify,业务方只需要 create,应该拆成 OrderCreateService。这个原则和 LSP 有时会冲突,解决办法是先按 ISP 拆小接口,每个小接口内部再按 LSP 继承扩展。

第五,依赖倒置原则 DIP(Dependency Inversion):面向接口编程,高层不依赖低层,都依赖抽象。反例是 UserService 直接 new MySqlUserDao,应该 @Autowired UserDao。这个原则是开闭原则的工程手段——只有面向接口编程,才能通过"新增实现类"来扩展。

另外两个补充原则:

第六,合成复用原则 CRP(Composite Reuse):优先组合,而不是继承,也叫"合成优于继承"。反例是用继承实现"可序列化用户",应该用组合 User 里注入 Serializer。这个原则是实现开闭原则的替代方案,组合比继承更灵活。

第七,迪米特法则 LOD(Law of Demeter):最少知识原则,"只和直接的朋友谈",减少对象间的耦合。反例是 a.getB().getC().doSomething() 链条太长,应该封装成 a.doX()。落地方法是控制对象间调用链不超过 2 层。

原则之间的关系:SRP 是基础(单一职责),其他原则建立在它之上;OCP 是目标(对修改关闭),需要 LSP/DIP/ISP/CRP 来支撑;DIP 是 OCP 的工程手段(面向接口才能扩展);ISP 让 DIP 更纯粹(小接口更好用)。

实际工程中我一般会先用 SOLID 检查设计,再用设计模式落地——比如用策略模式实现 OCP、用工厂模式配合 DIP、用模板方法保证 LSP。这三大问题(SRP + OCP + DIP)在实际重构中用得最多。