本文介绍23种设计模式之责任链模式。
定义
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。当你想要让一个以上的对象有机会处理某个请求时,就可以使用责任链模式。
描述
- 模式名称:CHAIN OF RESPONSIBILITY(责任链)
- 类型:对象行为型模式
- 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
- 适用性:
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
- 效果:
- 优点:
- 降低耦合度。
- 增强了给对象指派职责的灵活性。
- 缺点:
- 不能保证请求一定被接收。
类图
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(ConcreteHandler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
实现代码
Handler
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
abstract void handleRequest();
}
ConcreteHandler
public class SpamHandler extends Handler {
@Override
void handleRequest() {
//判断是否可以处理,处理不了就交给后继者
System.out.println("SpamHandler 处理不了,交由继承者处理");
successor.handleRequest();
}
}
public class FanHandler extends Handler {
@Override
void handleRequest() {
//判断是否可以处理,处理不了就交给后继者
System.out.println("FanHandler 处理不了,交由继承者处理");
successor.handleRequest();
}
}
public class ComplaintHandler extends Handler {
@Override
void handleRequest() {
//判断是否可以处理,处理不了就交给后继者
System.out.println("ComplaintHandler 处理不了,交由继承者处理");
successor.handleRequest();
}
}
public class NewLocHandler extends Handler {
@Override
void handleRequest() {
//判断是否可以处理,处理不了就交给后继者
System.out.println("NewLocHandler 处理完成");
}
}
client
public class Client {
public static void main(String[] args) {
SpamHandler spamHandler = new SpamHandler();
FanHandler fanHandler = new FanHandler();
ComplaintHandler complaintHandler = new ComplaintHandler();
NewLocHandler newLocHandler = new NewLocHandler();
spamHandler.setSuccessor(fanHandler);
fanHandler.setSuccessor(complaintHandler);
complaintHandler.setSuccessor(newLocHandler);
spamHandler.handleRequest();
}
}
执行结果:
SpamHandler 处理不了,交由继承者处理
FanHandler 处理不了,交由继承者处理
ComplaintHandler 处理不了,交由继承者处理
NewLocHandler 处理完成