当前位置: 首页 > news >正文

设计模式——七大常见设计原则

    

目录

单一职责原则(SRP)

开闭原则(OCP)

里氏替换原则(LSP)

依赖倒置原则(DIP)

接口隔离原则(ISP)

迪米特法则(LoDge)

合成复用原则(CRP)


    设计原则是一套经过长期实践总结的核心指导思想,旨在帮助开发者构建高内聚、低耦合、可复用、可扩展、易维护的软件系统。这些原则是设计模式的灵魂,多数设计模式都是针对某几个设计原则的具体实现的。

单一职责原则(SRP)

    核心定义:一个类(模块、函数)应该只有一个引起它变化的原因,即只负责一项明确的职责。

    本质:降低类的复杂度,避免“万能类”,减少修改带来的连锁反应。若一个类的职责过多,修改其中一个职责时,可能会破坏其他的功能。

//错误示例
public class Person {public void save(){}public void sendEmail(){}public void sing(){}
}//正确示例,职责分离
public class PersonSave {public void save(){}
}
public class PersonEmail {public void sendEmail(){}
}
public class PersonSing {public void sing(){}
}

开闭原则(OCP)

    核心定义:软件实体应该对扩展开放,对修改关闭。

    本质:这是设计模式的核心目标,通过扩展避免修改原有的代码,降低引入bug的风险,同时提高系统的可扩展性。

//定义基础接口
public interface Person {void happy();
}//具体实现
public class Cat implements Person {@Overridepublic void happy() {System.out.println("喵喵喵");}
}
public class Dog implements Person {@Overridepublic void happy() {System.out.println("汪汪汪");}
}

里氏替换原则(LSP)

    核心定义:所有引用基类(父类、抽象类)的地方,必须能透明地替换成子类的对象,且不会影响原来的程序。

    本质:子类不能破坏父类的行为约定。LSP是实现OCP的基础。

public class Bird {public void fly() {System.out.println("Bird is flying");}
}// 错误示例:企鹅不能飞
public class Penguin extends Bird {@Overridepublic void fly() {throw new UnsupportedOperationException("Penguins can't fly");}
}// 正确示例:重新设计继承关系
public abstract class Bird {public abstract void move();
}public class FlyingBird extends Bird {@Overridepublic void move() {System.out.println("Flying bird is flying");}
}public class SwimmingBird extends Bird {@Overridepublic void move() {System.out.println("Swimming bird is swimming");}
}

依赖倒置原则(DIP)

    核心定义:高层模块不能依赖低层模块,都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。

    本质:通过依赖抽象而非具体实现,降低模块间的耦合性。

// 抽象接口
public interface MessageService {void sendMessage(String message);
}// 具体实现
public class EmailService implements MessageService {@Overridepublic void sendMessage(String message) {System.out.println("Sending email: " + message);}
}public class SMSService implements MessageService {@Overridepublic void sendMessage(String message) {System.out.println("Sending SMS: " + message);}
}// 高层模块依赖抽象
public class NotificationService {private MessageService messageService;public NotificationService(MessageService messageService) {this.messageService = messageService;}public void notify(String message) {messageService.sendMessage(message);}
}

接口隔离原则(ISP)

    核心定义:使用接口的类不应该被迫依赖不需要的方法,每个接口只包含客户端需要的方法。

    本质:避免接口污染,客户端实现接口时,需被迫实现用不到的方法,这样既增加冗余代码,又破坏单一职责。SRP针对“类的职责”,ISP针对“接口的方法粒度”。

// 错误示例:接口过于庞大
public interface Worker {void work();void eat();void sleep();
}// 正确示例:接口分离
public interface Workable {void work();
}public interface Eatable {void eat();
}public interface Sleepable {void sleep();
}public class Human implements Workable, Eatable, Sleepable {@Overridepublic void work() { /* 工作 */ }@Overridepublic void eat() { /* 吃饭 */ }@Overridepublic void sleep() { /* 睡觉 */ }
}public class Robot implements Workable {@Overridepublic void work() { /* 工作 */ }// 只实现需要的接口
}

迪米特法则(LoDge)

    核心定义:一个对象应该对其他对象保持最少的了解。

    本质:降低对象间的耦合度,减少过度交互,若一个对象依赖过多的陌生对象,会导致关系复杂。

// 错误示例:暴露过多内部细节
public class Student {private String name;// getters and setters
}public class Class {private List<Student> students;public List<Student> getStudents() {return students;}
}public class School {private List<Class> classes;public void printAllStudents() {for (Class cls : classes) {for (Student student : cls.getStudents()) { // 违反迪米特法则System.out.println(student.getName());}}}
}// 正确示例:封装内部细节
public class Class {private List<Student> students;public void printStudents() {for (Student student : students) {System.out.println(student.getName());}}
}public class School {private List<Class> classes;public void printAllStudents() {for (Class cls : classes) {cls.printStudents(); // 只与直接朋友通信}}
}

合成复用原则(CRP)

    核心定义:优先使用合成或聚合实现代码复用,而不是优先使用继承。

    本质:避免继承的耦合问题,继承会让子类和父类绑定,而合成、聚合是弱耦合,一个类通过持有另一个类的实例来调用方法,避免继承的局限性。

// 错误示例:过度使用继承
public class Car {public void startEngine() { /* 启动引擎 */ }public void stopEngine() { /* 停止引擎 */ }
}public class ElectricCar extends Car {// 继承了不必要的引擎方法
}// 正确示例:使用组合
public class Engine {public void start() { /* 启动 */ }public void stop() { /* 停止 */ }
}public class ElectricMotor {public void start() { /* 启动电机 */ }public void stop() { /* 停止电机 */ }
}public class Car {private Engine engine;public Car(Engine engine) {this.engine = engine;}public void start() {engine.start();}
}

文章转载自:

http://tapbt5Ox.wkxsy.cn
http://bWTBXhhe.wkxsy.cn
http://qP9FHw14.wkxsy.cn
http://NhddjXoL.wkxsy.cn
http://1QldPnxp.wkxsy.cn
http://d6ogfNPT.wkxsy.cn
http://EavidZak.wkxsy.cn
http://fu5XsLWn.wkxsy.cn
http://x4fzIHVD.wkxsy.cn
http://1LbchNo3.wkxsy.cn
http://W5XLhG1X.wkxsy.cn
http://EWkQY9ek.wkxsy.cn
http://51VTqB8v.wkxsy.cn
http://tiGKY2fW.wkxsy.cn
http://UTshUERC.wkxsy.cn
http://IWQCDWJD.wkxsy.cn
http://QyVCR6Ep.wkxsy.cn
http://iqw7kuL8.wkxsy.cn
http://XfDHcL7M.wkxsy.cn
http://gOVYRc1g.wkxsy.cn
http://GcMZHTKW.wkxsy.cn
http://hAz6BiD4.wkxsy.cn
http://I02GXsCN.wkxsy.cn
http://8TEu3g3i.wkxsy.cn
http://IH0JTSMz.wkxsy.cn
http://AFG9Rrol.wkxsy.cn
http://5RipBXHp.wkxsy.cn
http://JAks8FGb.wkxsy.cn
http://L3Hlwctn.wkxsy.cn
http://om652r90.wkxsy.cn
http://www.dtcms.com/a/379420.html

相关文章:

  • 请创建一个视觉精美、交互流畅的进阶版贪吃蛇游戏
  • 利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
  • 时序数据库:定义与基本特点
  • 【WorkManager】Android 后台任务调度的核心组件指南
  • python项目批量安装包和生成requirements.txt文件
  • 零部件力学测试系统参数
  • 3D Web轻量引擎HOOPS赋能BIM/工程施工:实现超大模型的轻量化加载与高效浏览!
  • Java Web应用的安全性与防护措施!
  • 填写简历信息
  • 优先算法——专题十一:字符串
  • [Spring Cloud][3]从零开始简单工程搭建实践详解,远程调用
  • 为什么要显示调用析构函数
  • MySQL 数据完整性与约束:从基础到实战,守护数据准确性
  • Python中的“占位符”艺术:深入理解pass关键字的妙用
  • 构建企业级Python离线包仓库:从下载到服务部署全流程指南
  • C++面向对象之多态
  • 个人自留笔记——git操作
  • 命令模式,餐厅订单管理系统C++
  • Android EDLA测试命令总结
  • opencv基础实践;银行卡号识别
  • 【录屏软件】 实用工具推荐——电脑录屏软件班迪(Bandicam)录屏图文安装指南
  • 微服务事务管理实践与 Seata 框架解析
  • 今日行情明日机会——20250911
  • P4105 [HEOI2014] 南园满地堆轻絮
  • Docker 命令核心语法、常用命令
  • Windows安装Chroma DB
  • 60_基于深度学习的羊群计数统计系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • Linux 命令 top、vmstat、iostat、free、iftop 正常用法和退出.
  • 深入解析HashMap:从原理到实践的全方位指南
  • LNMP 与 LNMT 架构实战指南:从部署到运维全流程