职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
Handler类,定义一个处理请求的接口。
public abstract class Handler {
protected Handler mSuccessor;
// 设置继任者
public void setSuccessor(Handler successor) {
mSuccessor = successor;
}
public abstract void handleRequest(int request);
}ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println(getClass().getSimpleName() + "处理请求");
} else if (mSuccessor != null) {
mSuccessor.handleRequest(request);
}
}
}public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println(getClass().getSimpleName() + "处理请求");
} else {
System.out.println("请求错误,无法处理");
}
}
}调用:
ConcreteHandler1 handler1 = new ConcreteHandler1();
ConcreteHandler2 handler2 = new ConcreteHandler2();
handler1.setSuccessor(handler2);
handler1.handleRequest(2);
handler1.handleRequest(12);
handler1.handleRequest(22);输出结果:
ConcreteHandler1处理请求
ConcreteHandler2处理请求
请求错误,无法处理职责链的好处:
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。
可以随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
一个请求极有可能到了链的末端都得不到处理,或者因为没有正确的配置而得不到处理。需要事先考虑全面。
管家中骚扰拦截、私密空间、手机找回模块都需要处理短信,可以根据优先级处理短信,号码不在该模块的话把请求交给下一个对象处理。
本文介绍了职责链模式的基本概念,通过示例代码展示了如何使用Handler类和ConcreteHandler类实现请求的处理与传递。职责链模式允许多个对象有机会处理请求,简化了对象间的连接,并增强了职责分配的灵活性。
1032

被折叠的 条评论
为什么被折叠?



