1. 定义
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
2. 角色
- Handler:抽象处理角色者
- ConcreteHandler:具体处理角色者
3. 特点
- 优点:将请求的发送者和接收者解耦,易于改变链内成员或改动次序,能够动态地新增或修改责任。
- 缺点:请求不一定会被执行,当没有任何对象可以处理请求时,该请求会落到链尾端之外。
4. 示例
制作一个简易过滤器,过滤特定字符。
Handler:
public abstract class Handler {
private Handler handler = null;
public Handler getHandler() {
return this.handler;
}
public void setHandler(Handler successor) {
this.handler = successor;
}
public abstract void handlerRequest(List<String> list);
}
具体处理类:
// AlphaFilter
import java.util.List;
public class AlphaFilter extends Handler {
public void handlerRequest(List<String> list) {
if (list.contains("abc")) {
list.remove("abc");
System.out.println("remove abc");
}
if (getHandler() != null) {
getHandler().handlerRequest(list);
}
}
}
// DigitHandler
import java.util.List;
public class DigitFilter extends Handler {
@Override
public void handlerRequest(List<String> list) {
if (list.contains("123")) {
list.remove("123");
System.out.println("remove 123");
}
if (getHandler() != null) {
getHandler().handlerRequest(list);
}
}
}
测试类:
public class TestHandler {
public static void main(String[] args) {
Handler h1 = new AlphaFilter();
Handler h2 = new DigitFilter();
h2.setHandler(h1);
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("1a1");
list.add("abc");
list.add("789");
list.add("123");
h2.handlerRequest(list);
}
}
// 输出
// remove 123
// remove abc
参考:
1. 《Head First 设计模式》