责任链模式/chain of responsibility/行为型模式

职责链模式 chain of responsibility

意图

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

动机

给多个对象处理一个请求的机会,从而解耦发送者和请求者。

从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不明确地知道哪一个对象将会处理它,可以当做是一个隐式接受者。

沿着链发送请求,并保证接受者为隐式的,每个链上的对象都有一致的处理请求和访问链上后继者的接口。

java实现三要素: 接口(处理请求+后继链)+具体实现(能处理请求就处理,否则转给后继链)

优点:

降低耦合,简化对象链接,仅需保持一个指向后继者的引用。

注意点:

链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。

代码实现

/**
* 定义操作和获得后继链
*
*/
public interface Handler {
void handle(); Handler getNextHandler();
} public class Handler1 implements Handler{
private Handler handler=new Handler2(); @Override
public void handle() {
System.out.println("this is handler 1.");
if (getNextHandler()!=null) {//有后继,则往后传递
getNextHandler().handle();
}
} @Override
public Handler getNextHandler() {
return handler;
}
} public class Handler2 implements Handler{ @Override
public void handle() {
System.out.println("this is handler 2.");
if (getNextHandler()!=null) {
getNextHandler().handle();//无后继,终止。
}
} @Override
public Handler getNextHandler() {
return null;
}
} //测试
public class Test { public static void main(String[] args) {
Handler handler=new Handler1();
handler.handle();
}
}

责任链模式/chain of responsibility/行为型模式

JDK中的责任链模式

把一个对象在一个链接传递直到被处理。在这个链上的所有的对象有相同的接口(抽象类)但却有不同的实现。

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

上一篇:Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks dp+矩阵加速


下一篇:Codeforces Round #341 (Div. 2) ABCDE