【概念】
为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
【结构】
【演示代码】
抽象处理者
package com.test;
public abstract class Handler {
private Handler next;
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
public abstract void handler();
}
具体处理者01
package com.test;
public class ConcreteHandler01 extends Handler {
@Override
public void handler() {
System.out.println("this is ConcreteHandler01");
if (getNext() != null) {
getNext().handler();
}
}
}
具体处理者02
package com.test;
public class ConcreteHandler02 extends Handler {
@Override
public void handler() {
System.out.println("this is ConcreteHandler02");
if (getNext() != null) {
getNext().handler();
}
}
}
客户类
package com.test;
public class Client {
public static void main(String[] args) {
Handler handler01 = new ConcreteHandler01();
Handler handler02 = new ConcreteHandler02();
handler01.setNext(handler02);
handler01.handler();
}
}
运行结果
this is ConcreteHandler01
this is ConcreteHandler02
进程已结束,退出代码0
【经典案例:Interceptor】
抽象处理者:HandlerInterceptor
具体处理者(之一):RequestContextInterceptor
客户类:HandlerExecutionChain
(1)创建处理链
(2)执行处理链
【尾声】
Handler 可以是接口类,即 Concrete Handler 是接口实现类。
Client 可以是 Chain 类,即维护一个 List<Handler> 对象,按列表顺序进行执行处理链。
综上,这是一个非常棒的设计模式,特别是用来处理将一个大集合变成一个小集合的业务逻辑。例如:提取符合某些特定条件的会员数据,推送营销消息。