职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
图如下:
UML很简单,让我们先来看一个简单的例子。
四. 职责链模式应用之请假管理
请假这个事情,相信每个人都不陌生。
我们公司是个相对很宽松的公司。
在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了。
如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了。
如果超过了2天,你就需要去找总经理了,工资当然也玩完了。
那么,对于我们来说,这个流程就是这样的。
也就是这样一个过程,你需要和你的直接上级——项目经理去打交道,最终可能是项目经理给你回邮件,可能是人事部给你回邮件,也可能是总经理给你回邮件。内部的过程其实应该是个黑盒子,你并不知道内部的消息是如何处理的。你需要找到的,只是你想要第一个交付的对象而已。
Chain of Responsibility(CoR)职责链模式,CoR模式是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。
优点: 因为无法预知来自外界(客户端)的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。
缺点: 缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成;扩展性差,因为在CoR中,一定要有一个统一的接口Handler.局限性就在这里.
在此写了10个java类来描述说明Chain of Responsibility设计模式的实现方式;
1、 Handler.java 请求处理类接口
2、 HandlerStudent.java 学生请求处理类
3、 HandlerTeacher.java 老师请求处理类
4、 HandlerSchoolmaster.java 校长请求处理类
5、 Request.java 请求类接口
6、 RequestStudent.java 学生请求类
7、 RequestTeacher.java 老师请求类
8、 RequestSchoolmaster.java 校长请求类
9、 RequestPresident.java 总统请求类
10、TestCoR.java 带有main方法的测试类
=============== 1、 Handler.java
package cor;
public interface Handler {
public void handleRequest(Request request);
}
=============== 1 end
=============== 2、 HandlerStudent.java
package cor;
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!");
}
}
}
}
=============== 2 end
=============== 3、 HandlerTeacher.java
package cor;
public class HandlerTeacher implements Handler {
//下一个Handler对象
private Handler nextSuccessor;
public HandlerTeacher(Handler nextSuccessor) {
this.nextSuccessor = nextSuccessor;
}
public void handleRequest(Request request) {
//处理 TeacherRequest
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!");
}
}
}
}
=============== 3 end
=============== 4、 HandlerSchoolmaster.java
package cor;
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!");
}
}
}
}
=============== 4 end
=============== 5、 Request.java
package cor;
public interface Request {
//请求类型
public String getType();
//执行任务
public void execute();
}
=============== 5 end
=============== 6、 RequestStudent.java
package cor;
public class RequestStudent implements Request {
public void execute() {
System.out.println("[RequestStudent] :t Students request has been accepted!");
}
public String getType() {
return "StudentRequest";
}
}
=============== 6 end
=============== 7、 RequestTeacher.java
package cor;
public class RequestTeacher implements Request {
public void execute() {
System.out.println("[RequestTeacher] :t Teachers request has been accepted!");
}
public String getType() {
return "TeacherRequest";
}
}
=============== 7 end
=============== 8、 RequestSchoolmaster.java
package cor;
public class RequestSchoolmaster implements Request {
public void execute() {
System.out.println("[RequestSchoolmaster] :t Schoolmasters request has been accepted!");
}
public String getType() {
return "SchoolmasterRequest";
}
}
=============== 8 end
=============== 9、 RequestPresident.java
package cor;
public class RequestPresident implements Request {
public void execute() {
System.out.println("[RequestPresident] :t Presidents request has been accepted!");
}
public String getType() {
return "PresidentRequest";
}
}
=============== 9 end
=============== 10、 TestCoR.java
package cor;
public class TestCoR {
public static void main(String[] args) {
Handler handler = new HandlerStudent(new HandlerTeacher(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("-----------");
}
}
=============== 10 end