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

设计模式——开闭、单一职责及里氏替换原则

设计原则是指导软件设计和开发的一系列原则,它们帮助开发者创建出易于维护、扩展和理解的代码。以下是你提到的几个关键设计原则的简要说明:

开闭原则(Open/Closed Principle, OCP):
开闭原则由Bertrand Meyer提出,强调软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着设计时应该允许在不修改现有代码的基础上增加新功能。通常通过抽象和接口来实现这一点。

单一职责原则(Single Responsibility Principle, SRP):
单一职责原则由Robert C. Martin提出,主张一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一项任务。这有助于减少类之间的耦合,提高代码的可维护性。

里氏替换原则(Liskov Substitution Principle, LSP)
里氏替换原则由Barbara Liskov提出,主要关注继承关系。它指出,子类对象必须能够替换其基类对象,而不影响程序的正确性。这意味着子类应该能够扩展基类的功能,而不是改变基类的行为。

这些原则是面向对象设计中SOLID原则的一部分,SOLID是五个原则的缩写,每个字母代表一个原则:

S - 单一职责原则(Single Responsibility Principle)
O - 开闭原则(Open/Closed Principle)
L - 里氏替换原则(Liskov Substitution Principle)
I - 接口隔离原则(Interface Segregation Principle)
D - 依赖倒置原则(Dependency Inversion Principle)
遵循这些原则可以帮助开发者创建出更加健壮、灵活和可维护的软件系统。

以下是使用Java代码来展示SOLID原则中提到的三个原则的示例:

单一职责原则(SRP)
public class EmailService {
public void sendEmail(String recipient, String subject, String body) {
// 发送电子邮件的实现代码
}
}

// 假设我们有一个类专门发送短信
public class SMSService {
public void sendSMS(String recipient, String message) {
// 发送短信的实现代码
}
}
开闭原则(OCP)
使用接口和抽象类来实现开闭原则:

public interface NotificationService {
void sendNotification(String recipient, String message);
}

public class EmailNotificationService implements NotificationService {
private EmailService emailService;

public EmailNotificationService(EmailService emailService) {this.emailService = emailService;
}@Override
public void sendNotification(String recipient, String message) {emailService.sendEmail(recipient, "Subject", message);
}

}

public class SMSNotificationService implements NotificationService {
private SMSService smsService;

public SMSNotificationService(SMSService smsService) {this.smsService = smsService;
}@Override
public void sendNotification(String recipient, String message) {smsService.sendSMS(recipient, message);
}

}
里氏替换原则(LSP)
确保子类可以替换其基类:

public class Animal {
public void makeSound() {
System.out.println(“Some generic sound”);
}
}

public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println(“Woof!”);
}
}

public class AnimalSoundMaker {
public void makeAnimalSound(Animal animal) {
animal.makeSound();
}
}

// 使用AnimalSoundMaker来调用Dog的makeSound方法
public class Main {
public static void main(String[] args) {
AnimalSoundMaker maker = new AnimalSoundMaker();
Animal myDog = new Dog();
maker.makeAnimalSound(myDog); // 应该输出 “Woof!”
}
}
在这些示例中,我们遵循了单一职责原则,为不同的功能创建了不同的类;遵循了开闭原则,通过使用接口和依赖注入来扩展功能,而不需要修改现有代码;遵循了里氏替换原则,确保子类可以替换其基类,而不影响程序的正确性。

http://www.lryc.cn/news/388551.html

相关文章:

  • 代码随想录算法训练营第59天:动态[1]
  • jvm性能监控常用工具
  • ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)
  • HTTP协议头中X-Forwarded-For是能做什么?
  • Linux高并发服务器开发(八)Socket和TCP
  • 力扣第220题“存在重复元素 III”
  • Qt实战项目——贪吃蛇
  • Windows 10,11 Server 2022 Install Docker-Desktop
  • C++中的RAII(资源获取即初始化)原则
  • 【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战
  • ubuntu22.04 编译安装openssl C++ library
  • 百度Agent初体验(制作步骤+感想)
  • 7-491 3名同学5门课程成绩,输出最好成绩及所在的行和列(二维数组作为函数的参数)
  • OpenCloudOS开源的操作系统
  • 排序题目:多数元素 II
  • <电力行业> - 《第1课:电力行业的五大四小》
  • 数据库定义语言(DDL)
  • mybatis实现多表查询
  • 数据结构:队列详解 c++信息学奥赛基础知识讲解
  • 硬件开发笔记(二十三):贴片电阻的类别、封装介绍,AD21导入贴片电阻原理图封装库3D模型
  • Kafka基本原理详解
  • 【Unity】RPG2D龙城纷争(七)关卡编辑器之剧情编辑
  • uniapp启动页面鉴权页面闪烁问题
  • 全志H616交叉编译工具链的安装与使用
  • 深入解析Java和Go语言中String与byte数组的转换原理
  • 什么是strcmp函数
  • Follow Carl To Grow|【LeetCode】491.递增子序列,46.全排列,47.全排列 II
  • pytorch nn.Embedding 用法和原理
  • Python中常用的有7种值(数据)的类型及type()语句的用法
  • 某配送平台未授权访问和弱口令(附赠nuclei默认密码验证脚本)