设计模式之依赖倒转原则

定义

1
2
3
依赖倒转原则:抽象不应该依赖细节,细节更应该依赖抽象。
// 说白了就是要针对接口变成,不要对现实编程。
官方解释:高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。通过依赖抽象(如接口或抽象类)而不是具体实现,代码可以更灵活和易于维护
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Main {
// 高层模块
static class Application {
private final MessageService messageService;

// 通过依赖注入的方式,使得高层模块依赖于抽象接口而不是具体实现
public Application(MessageService messageService) {
this.messageService = messageService;
}

public void processMessage(String message, String recipient) {
// 调用抽象接口的方法
messageService.sendMessage(message, recipient);
}
}

// 抽象接口
interface MessageService {
void sendMessage(String message, String recipient);
}

// 低层模块1:Email消息服务的具体实现
static class EmailService implements MessageService {
@Override
public void sendMessage(String message, String recipient) {
System.out.println("发送邮件到 " + recipient + ",内容:" + message);
}
}

// 低层模块2:短信消息服务的具体实现
static class SMSService implements MessageService {
@Override
public void sendMessage(String message, String recipient) {
System.out.println("发送短信到 " + recipient + ",内容:" + message);
}
}

// 客户端代码
public static void main(String[] args) {
// 依赖倒转:高层模块依赖于接口,而非具体的实现类
MessageService emailService = new EmailService();
Application app1 = new Application(emailService);
app1.processMessage("你好,欢迎使用我们的服务!", "user@example.com");

MessageService smsService = new SMSService();
Application app2 = new Application(smsService);
app2.processMessage("您的验证码是123456", "13800138000");
}
}