责任链模式(Chain of Responsibility Pattern)
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理他为止。
动机
每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。给多个对象处理一个请求的机会,从而解耦发送者和接受者。该请求沿着对象链传递直至其中一个对象处理它。
使用场景
-
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
-
你想在不明确指定接受者的情况下,向多个对象的一个提交一个请求。
-
可处理一个请求的对象集合应被动态的指定。
结构
代码示例
//处理请求的抽象类
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void HandleRequest(int i);
}
//具体处理者
public class SparnHandler extends Handler {
@Override
public void HandleRequest(int i) {
if (i < 30) {
System.out.println("Sparn 来处理");
} else {
successor.HandleRequest(i);
}
}
}
//具体处理者
public class FanHandler extends Handler {
@Override
public void HandleRequest(int i) {
if (i < 60) {
System.out.println("Fan 来处理");
} else {
successor.HandleRequest(i);
}
}
}
//具体处理者
public class ComplalnHandler extends Handler {
@Override
public void HandleRequest(int i) {
if (i < 80) {
System.out.println("Complaln 来处理");
} else {
successor.HandleRequest(i);
}
}
}
//具体处理者
public class NewLocHandler extends Handler {
@Override
public void HandleRequest(int i) {
if (i < 99) {
System.out.println("NewLoc 来处理");
} else {
successor.HandleRequest(i);
}
}
}
public class Client{
public static void main(String[] args) {
Handler sparn = new SparnHandler();
Handler fan = new FanHandler();
Handler complaln = new ComplalnHandler();
Handler newLoc = new NewLocHandler();
//指定下一个处理者,应加个额外处理者,确保每个请求都能被处理
sparn.setSuccessor(fan);
fan.setSuccessor(complaln);
complaln.setSuccessor(newLoc);
sparn.HandleRequest(50);
}
}
: Fan 来处理
总结
此模式使得一个对象无需指定是其他的哪一个对象处理请求。对象仅需要知道该请求是否会被正确的处理。接受者和发送者都没有对方的明确信息,且链中的对象不需知道链的结构。责任链可简化对象的相互链接,它们仅需要保持一个指向其后继者的引用,而不需保持它所以的候选者的应用。
