一. 简述
为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。通俗一点说就是,当客户提交一个请求时,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不知道哪一个对象将会处理它。当然职责链中也可能没有可以处理该请求的对象,这种情况是允许发生的。
属于行为型模式。
二. 组成
- 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
- 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
三. UML类图
四. 基本代码
public interface Handler {
public void handleRequest(Request request);
}
public class HandlerStudent implements Handler {
// 下一个Handler对象
private Handler nextSuccessor;
public HandlerStudent(Handler nextSuccessor) {
this.nextSuccessor = nextSuccessor;
}
public void handleRequest(Request request) {
// 处理 StudentRequest
if (request.getType().equalsIgnoreCase("StudentRequest")) {
System.out.println("HandlerStudent begin to response StudentRequest;");
request.execute();
}
// 把请求传递给其它受理者
else {
if (this.nextSuccessor != null) {
nextSuccessor.handleRequest(request);
} else {
System.out.println("request[" + request.getType() + "] has not handler to deal!");
}
}
}
}
public class HandlerSchoolmaster implements Handler {
// 下一个Handler对象
private Handler nextSuccessor;
public HandlerSchoolmaster(Handler nextSuccessor) {
this.nextSuccessor = nextSuccessor;
}
public void handleRequest(Request request) {
// 处理 SchoolmasterRequest
if (request.getType().equalsIgnoreCase("SchoolmasterRequest")) {
System.out.println("HandlerSchoolmaster begin to response StudentRequest;");
request.execute();
} else { // 把请求传递给其它受理者
if (this.nextSuccessor != null) {
nextSuccessor.handleRequest(request);
} else {
System.out.println("request[" + request.getType() + "] has not handler to deal!");
}
}
}
}
public class HandlerTeacher implements Handler {
// 下一个Handler对象
private Handler nextSuccessor;
public HandlerTeacher(Handler nextSuccessor) {
this.nextSuccessor = nextSuccessor;
}
public void handleRequest(Request request) {
if (request.getType().equalsIgnoreCase("TeacherRequest")) {
System.out.println("HandlerTeacher begin to response StudentRequest;");
request.execute();
} else { // 把请求传递给其它受理者
if (this.nextSuccessor != null) {
nextSuccessor.handleRequest(request);
} else {
System.out.println("request[" + request.getType() + "] has not handler to deal!");
}
}
}
}
//以下是提出请求的类
/*请求类接口*/
public interface Request {
// 请求类型
public String getType();
// 执行任务
public void execute();
}
public class RequestPresident implements Request {
public void execute() {
System.out.println("[RequestPresident] :\t Presidents request has been accepted!");
}
public String getType() {
return "PresidentRequest";
}
}
public class RequestSchoolmaster implements Request {
public void execute() {
System.out.println("[RequestSchoolmaster] :\t Schoolmasters request has been accepted!");
}
public String getType() {
return "SchoolmasterRequest";
}
}
public class RequestStudent implements Request {
public void execute() {
System.out.println("[RequestStudent] :\t Students request has been accepted!");
}
public String getType() {
return "StudentRequest";
}
}
public class RequestTeacher implements Request {
public void execute() {
System.out.println("[RequestTeacher] :\t Teachers request has been accepted!");
}
public String getType() {
return "TeacherRequest";
}
}
//客户端
public class TestCoR {
public static void main(String[] args) {
// 这就是生成的一条职责链
//个人认为关键在这里
Handler handler = new HandlerTeacher(new HandlerStudent(new HandlerSchoolmaster(null)));
Request studentReq = new RequestStudent();
Request teacherReq = new RequestTeacher();
Request schoolmasterReq = new RequestSchoolmaster();
Request presidentReq = new RequestPresident();
// 传入student request
handler.handleRequest(studentReq);
System.out.println("-----------");
// 传入teacher request
handler.handleRequest(teacherReq);
System.out.println("-----------");
// 传入schoolmaster request
handler.handleRequest(schoolmasterReq);
System.out.println("-----------");
// 传入president request
handler.handleRequest(presidentReq);
System.out.println("-----------");
}
}
五. 优缺点
优点:
- 降低耦合度。
- 增强了给对象指派职责的灵活性。
缺点:
- 不能保证被处理。