设计模式(十一)--责任链模式

目录

责任链模式的关键概念

使用场景

例子

示例代码


责任链模式是一种设计模式,它允许请求沿着处理者链传递,直到其中一个处理者处理它为止。这种模式减少了请求发送者与接收者的耦合关系,因为发送者不需要知道是哪一个接收者处理其请求,接收者也不需要知道请求来自何方。每个接收者包含对其下一个接收者的引用,因此请求可以沿着这条链传递,直到被处理或到达链的末尾。

责任链模式的关键概念

  1. 请求:系统中的某个操作或任务。
  2. 处理者:能够处理请求的对象。每个处理者包含对其下一个处理者的引用。
  3. 责任链:一系列连接在一起的处理者对象,它们按照一定的顺序处理请求。

使用场景

责任链模式适用于以下情况:

  • 有多个对象可以处理请求,哪个对象处理该请求在运行时确定。
  • 请求应该由一个对象系列中的一个对象处理。
  • 可以动态指定一组对象处理请求。

例子

假设我们在开发一个电子邮件系统,需要对用户发送的邮件进行过滤,包括检查垃圾邮件、敏感词汇过滤、病毒检测等。我们可以通过责任链模式来实现这一过程。

示例代码

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 接口定义了过滤器的行为。每个具体的过滤器类实现了这个接口,并且拥有对其下一个过滤器的引用。当一个请求(即一封邮件)到来时,它首先被第一个过滤器处理。如果这个过滤器没有拒绝请求,则它会将请求传递给链中的下一个过滤器,依此类推,直到请求被处理或者到达链的末尾。

这种模式的优点是:

  • 简化了对象之间的连接。
  • 可以动态地增加或删除链中的处理者。
  • 增强了给对象分派职责的灵活性。
  • 使多个对象都有机会处理请求,避免单一对象责任过重。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值