文章來源:http://www.tuicool.com/articles/RJvARj
責任鏈(Chain of Responsibility)模式 :責任鏈模式是對象的行爲模式。使多個對象都有機會處理請求,從而避免請求的發送者和接受者直接的耦合關係。將這些對象連成一條鏈,沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。責任鏈模式強調的是每一個對象及其對下家的引用來組成一條鏈,利用這種方式將發送者和接收者解耦,類圖如下:
package chainOfResp;
/**
*
*作者:alaric
*時間:2013-8-17上午11:01:58
*描述:抽象處理角色
*/
public abstract class Handler {
protected Handler successor;
/**
*
*作者:alaric
*時間:2013-8-17上午11:04:22
*描述:處理方法
*/
public abstract void handlerRequest(String condition);
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
package chainOfResp;
/**
*
*作者:alaric
*時間:2013-8-17上午11:25:54
*描述:具體處理角色
*/
public class ConcreteHandler1 extends Handler {
@Override
public void handlerRequest(String condition) {
// 如果是自己的責任,就自己處理,負責傳給下家處理
if(condition.equals("ConcreteHandler1")){
System.out.println( "ConcreteHandler1 handled ");
return ;
}else{
System.out.println( "ConcreteHandler1 passed ");
getSuccessor().handlerRequest(condition);
}
}
}
package chainOfResp;
/**
*
*作者:alaric
*時間:2013-8-17上午11:25:54
*描述:具體處理角色
*/
public class ConcreteHandler2 extends Handler {
@Override
public void handlerRequest(String condition) {
// 如果是自己的責任,就自己處理,負責傳給下家處理
if(condition.equals("ConcreteHandler2")){
System.out.println( "ConcreteHandler2 handled ");
return ;
}else{
System.out.println( "ConcreteHandler2 passed ");
getSuccessor().handlerRequest(condition);
}
}
}
package chainOfResp;
/**
*
*作者:alaric
*時間:2013-8-17上午11:25:54
*描述:具體處理角色
*/
public class ConcreteHandlerN extends Handler {
/**
* 這裏假設n是鏈的最後一個節點必須處理掉
* 在實際情況下,可能出現環,或者是樹形,
* 這裏並不一定是最後一個節點。
*
*/
@Override
public void handlerRequest(String condition) {
System.out.println( "ConcreteHandlerN handled");
}
}
package chainOfResp;
/**
*
*作者:alaric
*時間:2013-8-17上午10:59:06
*描述:測試類
*/
public class Client {
/**
*作者:alaric
*時間:2013-8-17上午10:58:58
*描述:
*/
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handlern = new ConcreteHandlerN();
//鏈起來
handler1.setSuccessor(handler2);
handler2.setSuccessor(handlern);
//假設這個請求是ConcreteHandler2的責任
handler1.handlerRequest("ConcreteHandler2");
}
}
可以看出它們每個節點都可以做一些事情,所以不算一個純的責任鏈。
package chainOfResp.example;
/**
*
*作者:alaric
*時間:2013-8-17下午1:02:51
*描述:審批處理抽象類
*/
public abstract class Handler {
protected Handler handler;
/**
*
*作者:alaric
*時間:2013-8-17下午1:07:40
*描述:審批
*/
public abstract boolean approve(double day);
public Handler getHandler() {
return handler;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
}
package chainOfResp.example;
public class GroupLeader extends Handler {
@Override
public boolean approve(double day) {
if(day<0.5){
System.out.println("小組長審批通過");
return true;
}else {
System.out.println("小組長傳給了他的上司");
return getHandler().approve(day);
}
}
}
package chainOfResp.example;
public class ProjectManager extends Handler {
@Override
public boolean approve(double day) {
if(day<2){
System.out.println("項目經理審批通過");
return true;
}else {
System.out.println("項目經理傳給了他的上司");
return getHandler().approve(day);
}
}
}
package chainOfResp.example;
public class DepartmentManager extends Handler {
@Override
public boolean approve(double day) {
if(day<5){
System.out.println("部門經理審批通過");
return true;
}else {
System.out.println("部門經理傳給了他的上司");
return getHandler().approve(day);
}
}
}
package chainOfResp.example;
public class CEO extends Handler {
@Override
public boolean approve(double day) {
System.out.println("部門經理審批通過");
return true;
}
}
package chainOfResp.example;
/**
*
*作者:alaric
*時間:2013-8-17下午12:54:51
*描述:測試類,首先來創建責任鏈,然後發出請求模擬員工來請假
*/
public class Client {
/**
*作者:alaric
*時間:2013-8-17下午12:54:44
*描述:
*/
public static void main(String[] args) {
//創建節點
GroupLeader gl = new GroupLeader();
ProjectManager pm = new ProjectManager();
DepartmentManager dm = new DepartmentManager();
CEO ceo = new CEO();
//建立責任鏈
gl.setHandler(pm);
pm.setHandler(dm);
dm.setHandler(ceo);
//向小組長髮出申請,請求審批4天的假期
gl.approve(4D);
}
}
運行結果: