-
意图:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。 -
动机:
-
适用性:
a. 有多个对象可以处理一个请求,哪个对象处理请求运行时刻自动确定。
b. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
c. 可处理一个请求的对象集合应被动态指定。 -
结构:
一个典型的对象结构可能如下图所示:
-
参与者:
a. Handler:
定义一个处理请求的接口。
实现后继链。
b. ConcreteHandler:
处理它所负责的请求。
可访问它的后继者。
如果可处理请求,就处理之;否则将该请求转发给它的后继者。
c. Client:
向链上的具体处理对象提交请求。 -
协作:
当客户提交一个请求时,请求沿着链传递直至有一个ConcreteHandler对象负责处理它。 -
效果:
a. 降低耦合度
b. 增强了给对象指派职责的灵活性
c. 不保证被接收 -
实现:
a. 实现后继者链:1)定义新的链接。2)使用已有链接。
b. 连接后继者
c. 请求表示 -
代码示例:
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request ruquest);
}
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals(RequestType.TYPE_A)) {
System.out.println("ConcreteHandlerA handleRequest" +request.getName());
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals(RequestType.TYPE_B)) {
System.out.println("ConcreteHandlerB handleRequest" + request.getName());
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
//请求表示
public enum RequestType {
TYPE_A, TYPE_B, TYPE_C
}
public class Request {
private String name;
private RequestType type;
public Request(String name, RequestType type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public RequestType getType() {
return type;
}
}
public class Client {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setSuccessor(handlerB);
Request request1 = new Request("1", RequestType.TYPE_A);
handlerA.handleRequest(request1);
}
}
-
已知应用:
-
相关模式:
职责链常与Composite一起使用。