这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
职责链模式
为请求创建了一个接收者对象的链。而客户端不需要知道谁是具体的处理对象,也无须关心请求的处理细节和请求的传递过程,这样就实现了对请求的发送者和接收者进行解耦
结构
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
演示
1、抽象处理类
public abstract class Handler {
private Handler next;
public void setNext(Handler handler) {
this.next = handler;
}
public Handler getNext() {
return this.next;
}
public abstract void handleRequest(String name);
}
2、具体处理类
public class LiNing extends Handler {
@Override
public void handleRequest(String name) {
if (name!=null&&name.equals("lining")) {
System.out.println("李宁品牌!");
} else {
if (this.getNext()!=null) {
this.getNext().handleRequest(name);
} else {
System.out.println("无法处理!");
}
}
}
}
public class Erke extends Handler {
@Override
public void handleRequest(String name) {
if (name!=null&&name.equals("erke")) {
System.out.println("鸿星尔克品牌!");
} else {
if (this.getNext()!=null) {
this.getNext().handleRequest(name);
} else {
System.out.println("无法处理!");
}
}
}
}
3、客户端
public class Client {
public static void main(String[] args) {
Handler lining = new LiNing();
Handler erke = new Erke();
lining.setNext(erke);
lining.handleRequest("erke");
// 鸿星尔克品牌!
}
}
总结
优点
1、降低对象之间的耦合度,各个具体处理类无须知道链的结构
2、简化对象之间的相互连接
3、新增、删除具体处理类方便
缺点
1、无法保证请求就一定能被处理
2、具体处理类太多,调试不方便,可能导致循环调用
扩展:纯与不纯的职责链模式
纯的职责链模式:一个具体处理类处理一种请求,不存在处理一部分请求情况 不纯的职责链模式:一个请求分多个具体处理类处理