solid原则是解决开发痛点的工程尺子:srp强调变化原因唯一,ocp要求新增靠扩展而非修改,lsp确保子类替换父类时行为一致,isp主张小而专接口,dip通过依赖抽象实现解耦。

面向对象五大设计原则(SOLID)不是抽象教条,而是解决真实开发痛点的工程尺子——改一处逻辑,不牵连其他模块;加一个功能,不用动老代码;换一种实现,不重写调用方。它们共同指向一个目标:让代码结构能随业务一起呼吸、生长,而不是越改越僵。
单一职责原则(SRP):谁变了,别拖累别人
核心不是“类要小”,而是“变化原因要唯一”。当一个类同时处理用户数据、校验规则、数据库保存和日志输出时,只要其中任一环节调整(比如日志格式升级或校验规则变更),这个类就得改,风险就扩散了。
- 把 User 实体类只保留字段和基础 getter/setter,不放 save() 或 validate()
- 校验逻辑抽成 UserValidator,存储逻辑交给 UserRepository,通知逻辑归 NotificationService
- 前端组件同理:一个 Avatar 组件只渲染头像,权限判断交给 AuthContext,图片压缩由 ImageProcessor 负责
开放封闭原则(OCP):新功能靠“加”,不靠“改”
稳定模块(如订单结算主流程)应当封住修改入口,但为未来留出扩展缝。关键在于用抽象定义契约,让新增行为通过实现而非分支注入。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义 PaymentStrategy 接口,微信、支付宝、Apple Pay 各自实现,结算服务只依赖接口,不关心具体支付方式
- 用工厂或策略注册表动态加载新策略,避免在主逻辑里写 if-else 判断支付类型
- 规则类走配置驱动:优惠策略从硬编码改为读取 YAML,新增满减规则只需加配置,不动 Java 类
里氏替换原则(LSP):子类换父类,行为不能悄悄变
不是“能编译通过就行”,而是“运行时语义一致”。违反 LSP 的继承往往埋下静默 bug,尤其在多态遍历或集合操作中。
- 子类重写方法时,不能抛出父类未声明的异常,不能缩小访问权限,返回值不能比父类更宽泛
- 避免 Square 继承 Rectangle:若 setWidth() 和 setHeight() 被强制同步,会破坏 Rectangle 中 “宽高可独立设置” 的契约
- 优先用组合代替继承;若必须继承,用抽象类或接口明确定义前置条件、后置条件与不变量
接口隔离 + 依赖倒置(ISP + DIP):解耦靠“中间层”,不靠“硬连线”
这两条常协同生效:小而专的接口 + 高层依赖抽象 = 真正切断模块强绑定。
- 拒绝 ICrudService 这类“万能接口”,按角色拆:IOrderPlacer(下单)、IOrderNotifier(通知)、IOrderArchiver(归档)
- Controller 不 new UserRepository(),而是接收 IUserRepository 接口实例(通过构造器注入或 setter 注入)
- 数据库从 MySQL 换成 PostgreSQL?只需提供新实现类,业务层代码零改动
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










