本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/104454774
1、定义
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。(摘自《JAVA与模式》)
2、说明
在日常业务开发中,经常会遇到类似如下的业务场景:(1)参数校验;(2)业务数据入库;(3)业务逻辑处理;(4)调用第三方服务。类似这样的场景可能会面临业务复杂、情况多变的情况,但它们的流程却又大致相同。这时候,就可以考虑使用责任链模式,将各种不同的处理场景抽象为责任链中的一环,请求到来时沿着链条一次处理,最终完成处理并响应。这使得业务逻辑之间的耦合度降低,增强了系统的可扩展性。
责任链模式使得多个处理对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些处理器对象连成一条线,并沿着这条链传递请求,直到有一个处理器对象处理它为止。
责任链的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无需关心请求的处理细节和传递,将请求的发送者和处理者解耦。
比较典型的示例如J2EE中的Filter设计。
3、角色
抽象处理者角色:定义一个处理请求的接口,包含抽象处理方法和后继处理对象的引用。
具体处理者角色:实现抽象处理者的处理方法,如果可以则处理本次请求,将请求转给它的后继者。
客户角色:创建处理链,并向链头具体的处理者对象提交请求,它不关心处理的细节和请求的传递过程。
4、类图
5、示例
相关类如下所示:
/**
* 定义Handler接口
*/
public interface Handler<T> {
void handlerRequest(T request);
}
/**
* 抽象Handler类
*/
public abstract class AbstractHandler implements Handler<String> {
private Handler next;
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
}
/**
* 参数校验handler实现类
*/
public class ConcreteHandlerA extends AbstractHandler {
@Override
public void handlerRequest(String request) {
// 判断是否需要自己处理
if (StringUtils.isNotEmpty(request)) {
System.out.println("ConcreteHandlerA 参数检验处理");
}
// 转交给下一个处理着
if (getNext() != null) {
getNext().handlerRequest(request);
}
}
}
/**
* 具体业务handler实现类
*/
public class ConcreteHandlerB extends AbstractHandler {
@Override
public void handlerRequest(String request) {
// 判断是否需要自己处理
if (request.equalsIgnoreCase("test")) {
System.out.println("ConcreteHandlerB 业务处理");
}
// 转交给下一个处理着
if (getNext() != null) {
getNext().handlerRequest(request);
}
}
}
/**
* client
*/
public static void main(String[] args) {
AbstractHandler handlerA = new ConcreteHandlerA();
AbstractHandler handlerB = new ConcreteHandlerB();
handlerA.setNext(handlerB);
handlerA.handlerRequest("test");
}
}
运行结果:
ConcreteHandlerA 参数检验处理
ConcreteHandlerB 业务处理
6、总结
适用场景:
- 有多个处理器对象可以处理一个请求,哪个处理器对象处理该请求在运行时动态确定。
- 在不明确指定接收者的情况下,向多个处理器对象中的一个提交请求。
- 可以动态指定一组处理器对象处理请求。
优点:
- 降低耦合,使得请求发送者无需知道是哪个处理器对象处理请求。
- 简化对象的相互连接 。
- 增强了给对象指派责任的灵活性 。
- 方便添加新的请求处理类。
本文只是简单介绍了责任链模式,并未对其进行深入探讨,略显粗糙。希望本文对你有所帮助。