意图:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
适用性:
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。可处理一个请求的对象集合应被动态指定。
责任链模式的构成
- 传递者接口(Handler):定义一个处理请求的接口,实现链中下一个对象(可选)
- 具体传递者(ConcreteHandler):可以访问链中下一个对象,如果可以处理请求,就处理它,否则将请求转发给后继者
- 客户端(Client):向链中的对象发出请求
UML
责任链模式的要点
1、将一个业务流程中的多个步骤拆分开来,每个步骤封装到一个handler处理器中去
2、支持业务流程基于handler动态组装,不同的业务流程 handler代表的代码组件可以复用
package com.designpattern;
public class ChainPatternDemo {
public static void main(String[] args) {
// 业务流程1
Handler3 handler3 = new Handler3(null);
Handler2 handler2 = new Handler2(handler3);
Handler1 handler1 = new Handler1(handler2);
handler1.execute();
// 业务流程2
Handler2 handler3c = new Handler2(null);
Handler1 handler2c = new Handler1(handler3c);
Handler3 handler1c = new Handler3(handler2c);
handler1c.execute();
// 责任链的思想
// 1、将一个业务流程中的多个步骤拆分开来,每个步骤封装到一个handler处理器中去
// 2、支持业务流程基于handler动态组装,不同的业务流程 handler代表的代码组件可以复用
// 好处1:将这个代码封装到一个handler中,后面如果要对某个步骤的代码逻辑调整,修改一个handler即可
// 好处2:如果业务流程要修改,那么不需要拷贝大量的代码,只要基于handler动态组装业务流程即可
}
public static abstract class Handler {
protected Handler successor;
public Handler(Handler successor) {
this.successor = successor;
}
public abstract void execute();
}
public static class Handler1 extends Handler {
public Handler1(Handler successor) {
super(successor);
}
public void execute() {
System.out.println("执行功能1");
if (successor != null) {
successor.execute();
}
}
}
public static class Handler2 extends Handler {
public Handler2(Handler successor) {
super(successor);
}
public void execute() {
System.out.println("执行功能2");
if (successor != null) {
successor.execute();
}
}
}
public static class Handler3 extends Handler {
public Handler3(Handler successor) {
super(successor);
}
public void execute() {
System.out.println("执行功能3");
if (successor != null) {
successor.execute();
}
}
}
}