Java面向对象设计六大原则是应对需求变化、团队迭代与系统扩张的设计直觉:1.单一职责(SRP)强调类只因同一原因变化;2.开闭原则(OCP)要求对扩展开放、对修改关闭;3.里氏替换(LSP)确保子类可安全替换父类;4.依赖倒置(DIP)倡导依赖抽象而非实现;5.接口隔离(ISP)主张接口小而专;6.迪米特法则(LoD)提倡仅与直接朋友通信。

Java 面向对象设计的六大原则,不是编程技巧或语法规范,而是经过长期工程实践沉淀下来的“设计直觉”——它回答的是:当需求一变再变、团队持续迭代、系统越做越大时,代码怎么写才不容易崩、好改、易接手。
单一职责原则(SRP):一个类只管一件事
核心是“变化的原因”。如果一个类因为用户逻辑改要动,又因为日志格式变要动,还因为导出方式换要动,那它就有三个变化原因,违反了 SRP。
关键不在功能多少,而在是否由同一类原因驱动。比如 UserService 负责创建、查询、删除用户,这算一个职责(都是用户生命周期管理);但如果它还自己拼 SQL、写文件、发邮件,那就混进了数据访问、IO、通知等无关变化源。
拆分后好处明显:改日志不影响用户保存,测试更聚焦,复用更自由。
开闭原则(OCP):加功能靠扩展,不靠改老代码
对扩展开放,对修改关闭。本质是用抽象隔离变化。
典型做法是定义接口(如 PaymentStrategy),让不同支付方式(支付宝、微信、PayPal)各自实现,业务主流程(PaymentService)只依赖接口,不依赖具体实现。
新增一种支付方式?写个新类实现接口,注入进去即可。不用碰已有任何一行逻辑代码,避免牵一发而动全身的风险。
里氏替换原则(LSP):子类能安全顶替父类
不是“能编译通过就行”,而是“在所有用到父类的地方,换成子类对象,程序行为不变”。
常见误用:父类有 run() 方法,子类重写成抛异常或空实现;或者父类方法承诺“返回非 null”,子类却返回 null。
它倒逼你审慎使用继承——若子类不得不破坏父类契约,那大概率该用组合(has-a)而非继承(is-a)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
依赖倒置原则(DIP)与接口隔离原则(ISP):面向抽象协作,接口小而专
DIP 说的是:模块之间别直接依赖具体类,而应依赖抽象(接口或抽象类)。上层业务不应依赖 JDBC 实现,而应依赖 UserDao 接口。
ISP 是它的延伸:接口不能大而全。比如把“上传文件”“发送短信”“生成报表”全塞进一个 SystemService 接口,使用者被迫实现不需要的方法。应该拆成 FileUploader、SmsSender、ReportGenerator 等细粒度接口,各取所需。
迪米特法则(LoD):只和“最近的朋友”说话
降低类之间的耦合度。一个类应该只调用它直接依赖的对象的方法,不要跨层调用。
例如:OrderService 拿到 User 对象,不该写成 user.getAddress().getCity(),而应让 User 提供 getCity() 方法封装内部结构。
这样即使地址模型重构(比如拆成 HomeAddress 和 OfficeAddress),OrderService 也不用改。

















