Java六大设计原则以“解耦”为核心目标,包括单一职责(类仅一个变化原因)、开闭(对扩展开放、对修改封闭)、里氏替换(子类不破坏父类行为契约)、依赖倒置(依赖抽象而非实现)、接口隔离(接口小而专)、最少知识(只与直接朋友交互),共同提升代码可维护性、可扩展性与稳定性。

Java 面向对象设计六大原则不是抽象教条,而是围绕“解耦”这一核心目标形成的实践共识。它们共同指向一个目的:让代码在需求变化时,改得少、错得少、加得快。
单一职责(SRP):一个类只管一件事
重点不在“功能数量”,而在“变化原因”。如果用户数据变更和日志格式调整都会迫使你修改同一个类,那它就承担了两个职责。比如把 UserServiceImpl 同时塞进密码加密、短信发送、数据库保存逻辑,任一环节调整都可能波及其他。正确做法是拆出 PasswordEncoder、SmsService、UserRepository,各司其职。
开闭原则(OCP):新增靠加,老码不动
关键在于用抽象隔离变化点。支付模块不写死“微信支付”,而是定义 PaymentStrategy 接口;后续加 Apple Pay,只需新增 ApplePayImpl 并注入,原有调度逻辑(如 PaymentService.checkout())完全不用碰。违反 OCP 的典型是频繁修改 if-else 或 switch 分支来支持新类型。
里氏替换(LSP):子类能安心顶替父类
不是“能编译通过”就算合格,而是行为契约不能破坏。例如父类 Bird.fly() 表示“具备飞行能力”,子类 Ostrich 若重写为抛异常或空实现,调用方一旦多态使用就会出错。合理方案是提取 Flyable 接口,让 Sparrow 实现它,Ostrich 则不实现——这样替换才安全。
立即学习“Java免费学习笔记(深入)”;
依赖倒置(DIP)与接口隔离(ISP)+ 迪米特法则(LOD):三者协同降耦
DIP 要求模块依赖抽象(接口/抽象类),而非具体实现;ISP 要求接口小而专,避免强迫实现类承担无用方法;LOD 强调“只跟直接朋友说话”,比如 Service 不该直接操作 DAO 的内部字段,而应通过 DAO 提供的明确方法交互。这三者常一起落地:定义细粒度接口(ISP),让高层模块依赖它(DIP),并限制调用链深度(LOD)。


















