Java 面向对象设计五大基本原则

发布时间:2026/6/6 21:36:18

Java 面向对象设计五大基本原则 前言面向对象编程不只是会写类、继承、接口设计原则是代码好坏的分水岭。日常开发遵循设计原则代码易扩展、易维护、低耦合违背原则就会出现代码臃肿、改一处崩全项目、重复代码满天飞。 Java 主流遵循SOLID 五大原则也是所有设计模式的底层思想本篇结合 Java 代码通俗讲解。一、单一职责原则SRP定义一个类只负责一个功能、只有一个引起它修改的原因。一个类职责过多一处改动就可能牵连无关代码。反例违背java运行// 一个类既做用户数据库操作又做文件导出两个职责 class UserService{ // 数据库保存用户 public void saveUser(){} // Excel导出用户数据 public void exportExcel(){} }正确写法拆分java运行// 职责1用户CRUD class UserDbService{ public void saveUser(){} } // 职责2文件导出 class UserExcelService{ public void exportExcel(){} }总结高内聚、细分类一事一类。二、开闭原则OCP最重要核心原则定义对扩展开放对修改关闭。新增需求尽量新增代码不修改原有成熟源码。原有代码不动避免修改引入 BUG。场景支付方式拓展反例新增支付改原有代码java运行class Pay{ public void pay(String type){ if(wx.equals(type)){} // 新增支付宝要修改pay方法破坏原有代码 else if(ali.equals(type)){} } }正例用接口扩展不改原有代码java运行// 顶层支付接口 public interface Pay{ void pay(); } // 微信支付实现 class WxPay implements Pay{ Override public void pay(){} } // 新增支付宝新建类不动原有代码 class AliPay implements Pay{ Override public void pay(){} }后续再加抖音支付、银行卡支付只新建实现类即可。三、里氏替换原则LSP定义父类出现的地方都可以使用它的任意子类替换程序运行不受影响。子类不能重写破坏父类原有逻辑。要点子类可以扩展父类功能但不能修改父类原有方法实现多态本质就是里氏替换落地。java运行class Animal{ public void eat(){ System.out.println(动物吃饭); } } class Dog extends Animal{ Override public void eat(){ System.out.println(小狗啃骨头); } } // 父类引用接收子类替换无异常 public class Test{ public static void feed(Animal animal){ animal.eat(); } public static void main(String[] args) { feed(new Animal()); feed(new Dog()); // 子类完美替换父类 } }四、依赖倒置原则DIP核心面向抽象编程不面向具体实现高层模块不依赖低层模块二者都依赖抽象接口 / 抽象类抽象不依赖细节细节依赖抽象。反例高层直接依赖具体实现java运行// 高层业务直接依赖Dog具体类新增Cat就要改代码 class Person{ public void feed(Dog dog){ dog.eat(); } } class Dog{void eat(){}}优化依赖顶层 Animal 接口java运行interface Animal{void eat();} class Dog implements Animal{Override void eat(){}} class Cat implements Animal{Override void eat(){}} // 只依赖抽象随便换实现类 class Person{ public void feed(Animal animal){ animal.eat(); } }Spring IoC 容器底层就是依赖倒置思想。五、接口隔离原则ISP定义客户端不依赖不需要的接口大接口拆分成多个小而专用的接口杜绝臃肿万能接口。反例一个大接口包含全部方法java运行// 巨型接口鸟实现类被迫实现不需要的游泳方法 interface Animal{ void fly(); void run(); void swim(); } class Bird implements Animal{ Override public void swim(){} // 鸟类不会游泳被迫空实现 }优化拆分细粒度小接口java运行interface Fly{void fly();} interface Run{void run();} interface Swim{void swim();} // 鸟类只实现需要的接口 class Bird implements Fly,Run{ Override public void fly(){} Override public void run(){} }六、博客总结单一职责类只干一件事开闭原则加功能不加改旧代码里氏替换子类随便替换父类依赖倒置面向接口不面向 new 具体类接口隔离接口小巧专用拒绝大杂烩接口。日常编码时刻对照五项原则能大幅度提升代码健壮性也是框架源码与面试高频考点。

相关新闻