就如星爷多年前说的那样“你看那代码,好像一条链哎”。什么?他没说过吗,或许我记错了。你应该已经猜到了,这篇文章,我们来讨论一下责任链设计模式。这个模式并不流行,至少在GangofFour定义的模式中是这样。但现代依赖注入框架让我们可以用巧妙的新奇的方式去实现这个模式,我们来看看。
介绍
声明:这种模式并没有新东西。我的一个同事刚刚前几天使用过,我也曾用过很多次。这篇文章的灵感来源于我最近遇到的问题,我们下面来说说,我之前也没有意识到这个问题可以用这种模式来解决。
传统模式
责任链模式是一种行为设计模式,它首次在GangofFour写的DesignPatterns这本书中提及。模式的目的是:
避免请求的发送者与接收者耦合,为多个对象提供处理请求的机会.将接收对象串联成链,请求在链上传递,直到被一个对象处理.
类的关系图如下所示:
通过定义一个可以用来响应客户端请求的标准接口,来实现松耦合。在上面的图中,表现为Handler抽象类型。可以通过创建链式的类,继承上面的接口来实现多个类响应请求的能力。每一个类在链中拥有下一个节点的实例。successor属性满足作用域。
当调用时,每一个handler确定自己是否有能力处理请求。如果有,它执行请求的操作,在这,我们可以根据请求的转发规则实现许多不同的处理方式。一旦一个ConcreteHandler声明可以处理这个请求,我们可以实现规则用于停止请求在链中传递。这种情况下,handleRequest方法的实现方式如下所示:
if(/*Therequestcanbesuccessfullyhandled*/){
//Handletherequest
}else{
successor.handleRequest(request);
}
另一方面,我们可以将请求转发到链中的下一个handler,无论当前的handler是否能处理。
if(/*Therequestcanbesuccessfullyhandled*/){
//Handletherequest
}
successor.handleRequest(request);
构建链的操作应该和下面差不多。
Handlerchain=newConcreteHandler1(newConcreteHandler2(newConcreteHandler3()));
chain.handleRequest(request);
在JDK内部实现中,至少有两个地方用到了这种模式:
●logging机制的实现:java.util.logging.Logger#log()