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

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

开闭原则(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!”
}
}
在这些示例中,我们遵循了单一职责原则,为不同的功能创建了不同的类;遵循了开闭原则,通过使用接口和依赖注入来扩展功能,而不需要修改现有代码;遵循了里氏替换原则,确保子类可以替换其基类,而不影响程序的正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值