常见设计原则
发布时间:2026/10/5 9:18:10 锦皓数字建站

设计模式 7 大设计原则SOLID 迪米特 合成复用一句话总纲目的是降低耦合、提高复用、易于扩展、方便维护1. 单一职责原则 SRPSingle Responsibility Principle定义一个类只负责一件事只有一个引起它变化的原因。类的职责尽量单一不要写万能类。❌ 反例User类同时包含用户信息保存、密码加密、发送邮件、生成报表。用户改字段、邮件模板变都会改这个类。 ✅ 正例User仅用户实体属性UserRepository数据库保存EmailService发邮件2. 开闭原则 OCPOpen-Closed Principle定义对扩展开放对修改关闭。新增功能尽量加代码不要修改原有成熟代码。❌ 反例图形计算面积if else判断圆形、矩形新增三角形要修改原有getArea方法。 ✅ 正例抽象Shape接口有getArea()圆形、矩形、三角形各自实现接口。新增图形不用改旧代码新增一个类即可。3. 里氏替换原则 LSPLiskov Substitution Principle定义子类可以完全替换父类程序行为不会出错。子类不能破坏父类原有逻辑。❌ 反例父类Rectangle有宽高set子类Square正方形继承矩形setWidth同时修改height。把正方形当矩形传入计算函数会出错。 ✅ 正例正方形和矩形不继承共同实现一个图形接口。核心继承不能随便用子类不能重写后改变父类原有行为。4. 接口隔离原则 ISPInterface Segregation Principle定义不要大而臃肿的接口拆分细接口类不需要的方法就不要强迫它实现。❌ 反例一个大接口Worker包含work()、eat()、sleep()机器人实现这个接口被迫空实现eat、sleep。 ✅ 正例拆成Workable、Eatable、Sleepable多个小接口。机器人只实现Workable。5. 依赖倒置原则 DIPDependency Inversion Principle定义高层模块不要依赖低层模块二者都依赖抽象抽象不依赖细节细节依赖抽象。❌ 反例业务Service直接new MySQLDaoService强依赖MySQL实现换成Oracle就要改Service代码。 ✅ 正例定义UserDao接口MySQLUserDao、OracleUserDao实现接口。Service依赖UserDao接口运行时注入具体实现。Spring依赖注入就是典型6. 迪米特法则 LoD最少知道原则定义一个对象尽量少了解其他对象内部细节只和直接朋友通信不要访问陌生对象。不要链式调用a.getB().getC().doSomething()这就是典型违反迪米特。❌ 反例老板直接找员工的下属安排任务老板知道太多内部层级。 ✅ 正例老板只找主管主管再安排下属老板不接触底层员工。符合迪米特的写法// B类新增方法把C的动作包起来 class B{ private C c; public void doCWork(){ c.doSomething(); // B自己和C交互A看不到C } } // A只和B打交道完全不知道C的存在 B b a.getB(); b.doCWork();7. 合成复用原则 CRP组合优于继承定义优先使用组合/聚合来复用代码少用继承。继承是强耦合组合是弱耦合更灵活。❌ 反例Car继承Engine来复用引擎代码引擎是车的部件不是“车是引擎”。继承是is-a关系。 ✅ 正例Car里面持有Engine对象组合class Car { private Engine engine; }可以动态更换不同引擎。快速记忆口诀单、开、里、接、依迪米特合成优先SOLID 对应前5条SRP OCP LSP ISP DIP面试精简版单一职责一个类只做一件事开闭原则扩展开放修改关闭里氏替换子类可替换父类不破坏逻辑接口隔离细分接口不强迫实现不需要方法依赖倒置依赖抽象不依赖具体实现迪米特法则最少知道减少对象间耦合合成复用优先组合少用继承
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。