目录
责任链模式是一种设计模式,它允许请求沿着处理者链传递,直到其中一个处理者处理它为止。这种模式减少了请求发送者与接收者的耦合关系,因为发送者不需要知道是哪一个接收者处理其请求,接收者也不需要知道请求来自何方。每个接收者包含对其下一个接收者的引用,因此请求可以沿着这条链传递,直到被处理或到达链的末尾。
责任链模式的关键概念
- 请求:系统中的某个操作或任务。
- 处理者:能够处理请求的对象。每个处理者包含对其下一个处理者的引用。
- 责任链:一系列连接在一起的处理者对象,它们按照一定的顺序处理请求。
使用场景
责任链模式适用于以下情况:
- 有多个对象可以处理请求,哪个对象处理该请求在运行时确定。
- 请求应该由一个对象系列中的一个对象处理。
- 可以动态指定一组对象处理请求。
例子
假设我们在开发一个电子邮件系统,需要对用户发送的邮件进行过滤,包括检查垃圾邮件、敏感词汇过滤、病毒检测等。我们可以通过责任链模式来实现这一过程。
示例代码
java
深色版本
1// 定义处理者接口
2interface EmailFilter {
3 void setNextFilter(EmailFilter nextFilter);
4 void doFilter(Email email);
5}
6
7// 具体处理者类
8class SpamFilter implements EmailFilter {
9 private EmailFilter nextFilter;
10
11 @Override
12 public void setNextFilter(EmailFilter nextFilter) {
13 this.nextFilter = nextFilter;
14 }
15
16 @Override
17 public void doFilter(Email email) {
18 if (isSpam(email)) {
19 System.out.println("This is spam mail!");
20 } else if (nextFilter != null) {
21 nextFilter.doFilter(email);
22 }
23 }
24
25 private boolean isSpam(Email email) {
26 // 检查是否为垃圾邮件的逻辑
27 return email.getContent().contains("spam");
28 }
29}
30
31class SensitiveWordsFilter implements EmailFilter {
32 private EmailFilter nextFilter;
33
34 @Override
35 public void setNextFilter(EmailFilter nextFilter) {
36 this.nextFilter = nextFilter;
37 }
38
39 @Override
40 public void doFilter(Email email) {
41 if (containsSensitiveWords(email)) {
42 System.out.println("This email contains sensitive words!");
43 } else if (nextFilter != null) {
44 nextFilter.doFilter(email);
45 }
46 }
47
48 private boolean containsSensitiveWords(Email email) {
49 // 检查是否含有敏感词汇的逻辑
50 return email.getContent().contains("sensitive");
51 }
52}
53
54class VirusFilter implements EmailFilter {
55 private EmailFilter nextFilter;
56
57 @Override
58 public void setNextFilter(EmailFilter nextFilter) {
59 this.nextFilter = nextFilter;
60 }
61
62 @Override
63 public void doFilter(Email email) {
64 if (containsVirus(email)) {
65 System.out.println("This email contains virus!");
66 } else if (nextFilter != null) {
67 nextFilter.doFilter(email);
68 }
69 }
70
71 private boolean containsVirus(Email email) {
72 // 检查是否含有病毒的逻辑
73 return false;
74 }
75}
76
77// Email 类
78class Email {
79 private String content;
80
81 public Email(String content) {
82 this.content = content;
83 }
84
85 public String getContent() {
86 return content;
87 }
88}
89
90// 客户端代码
91public class Client {
92 public static void main(String[] args) {
93 Email email = new Email("This is a spam email with sensitive words");
94
95 EmailFilter spamFilter = new SpamFilter();
96 EmailFilter sensitiveWordsFilter = new SensitiveWordsFilter();
97 EmailFilter virusFilter = new VirusFilter();
98
99 // 设置责任链
100 spamFilter.setNextFilter(sensitiveWordsFilter);
101 sensitiveWordsFilter.setNextFilter(virusFilter);
102
103 // 处理邮件
104 spamFilter.doFilter(email);
105 }
106}
在这个例子中,EmailFilter
接口定义了过滤器的行为。每个具体的过滤器类实现了这个接口,并且拥有对其下一个过滤器的引用。当一个请求(即一封邮件)到来时,它首先被第一个过滤器处理。如果这个过滤器没有拒绝请求,则它会将请求传递给链中的下一个过滤器,依此类推,直到请求被处理或者到达链的末尾。
这种模式的优点是:
- 简化了对象之间的连接。
- 可以动态地增加或删除链中的处理者。
- 增强了给对象分派职责的灵活性。
- 使多个对象都有机会处理请求,避免单一对象责任过重。