面向对象基本原则 - SOLID原则

发布时间 2024-01-08 21:17:00作者: 东方来客

SOLID原则

SOLID原则包含五条原则,每条原则取首字母即SOLID。

Single Responsibility Principle 单一责任原则

定义:一个类只应该做一件事情
一个类如果需要做多个事情,那么就要拆分这个类。

public class User {  
    private String username;  
    private String password;  
  
    public User(String username, String password) {  
        this.username = username;  
        this.password = password;  
    }  
  
    public void setUsername(String username) {  
        this.username = username;  
    }  
  
    public void setPassword(String password) {  
        this.password = password;  
    }  
}

Open Closed Principle 开放封闭原则

定义:实体对扩展应该是开放的,对修改应该是封闭的
通过继承和接口实现多态,而不是直接修改现有类的代码。

interface Animal {  
    void makeSound();  
}  
  
class Dog implements Animal {  
    @Override  
    public void makeSound() {  
        System.out.println("Woof!");  
    }  
}  
  
class Cat implements Animal {  
    @Override  
    public void makeSound() {  
        System.out.println("Meow!");  
    }  
}

Liskov Substitution Principle 里氏替换原则

定义:子类必须能够替换其父类而不会引发错误。

描述:子类必须能够替换其父类,且程序的当功能前不会改变。

例子:如果有一个父类的方法返回一个对象的类型,那么任何使用这个返回值的代码在子类替换后也应该正常工作。

class Sms {  
    public void sendSms(double phoneNo) {   
        // ...
    }   
}   
    
class TencentSms extends Sms {   
   public void sendSms(double phoneNo) {   
        // ...
    }   
}

class AliSms extends Sms {   
   public void sendSms(double phoneNo) {   
        // ...
    }   
}

class Run {
	private Sms sms = new Sms();
	
	public void run(double phoneNo) {
	    sms.sendSms(phoneNo);
	}
} 

The Interface Segregation Principle 接口分离原则

定义:客户端不应该被强制依赖于它们不使用的接口。多个专门的接口比复合的单一接口好。

// 大的接口,包含了很多方法  
public interface LargeInterface {  
    void method1();  
    void method2();  
    void method3();  
    // ...更多方法...  
}  
  
// 拆分后的接口1,只包含客户端需要的方法1  
public interface SmallInterface1 {  
    void method1();  
}  
  
// 拆分后的接口2,只包含客户端需要的方法2和3  
public interface SmallInterface2 {  
    void method2();  
    void method3();  
}  
  
// 具体实现类,实现了拆分后的接口  
public class ConcreteClass implements SmallInterface1, SmallInterface2 {  
    @Override  
    public void method1() { // 实现方法1 }  
    @Override  
    public void method2() { // 实现方法2 }  
    @Override  
    public void method3() { // 实现方法3 }  
}

The Dependency Inversion Principle 依赖倒置原则

定义:高层模块不应该依赖于低层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,具体实现应该依赖于抽象。

// 定义一个抽象接口  
public interface MessageService {  
    void sendMessage(String message);  
}  
  
// 实现抽象接口的具体类  
public class EmailMessageService implements MessageService {  
    @Override  
    public void sendMessage(String message) {  
        // 实现发送电子邮件的逻辑  
    }  
}  
  
// 实现抽象接口的具体类  
public class SmsMessageService implements MessageService {  
    @Override  
    public void sendMessage(String message) {  
        // 实现发送短信的逻辑  
    }  
}  
  
// 高层模块,依赖于抽象接口MessageService,而不是具体类  
public class NotificationSystem {  
    private MessageService messageService;  
      
    public NotificationSystem(MessageService messageService) {  
        this.messageService = messageService;  
    }  
      
    public void notifyUser(String message, String recipient) {  
        messageService.sendMessage(message);  
    }  
}