??職責(zé)鏈模式(Chain of Responsibility):使多個對象都有機(jī)會處理請求班利,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈眯娱,并沿著這條鏈傳遞該請求铣墨,直到有一個對象處理它為止。
1嗽上、Handler類次舌,定義一個處理請示的接口。
/**
* @Description: 定義一個處理請求的接口
* @author: zxt
* @time: 2019年5月13日 下午9:31:56
*/
public abstract class Handler {
// 設(shè)置繼任者
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
// 處理請求的抽象方法
public abstract void HandleRequest(int request);
}
2兽愤、ConcreteHandler類彼念,具體處理者類,處理它所負(fù)責(zé)的請求浅萧,可訪問它的后繼者逐沙,如果可處理該請求,就處理之洼畅,否則就將該請求轉(zhuǎn)發(fā)給它的后繼者吩案。
/**
* @Description: 當(dāng)請求數(shù)在0到10之間則有權(quán)處理,否則轉(zhuǎn)到下一位
* @author: zxt
* @time: 2019年5月13日 下午9:49:34
*/
public class ConcreteHandler1 extends Handler {
@Override
public void HandleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println(this.getClass().getName() + " 處理請求 " + request);
} else if (successor != null) {
// 轉(zhuǎn)移到下一位
successor.HandleRequest(request);
}
}
}
/**
* @Description: 當(dāng)請求數(shù)在10到20之間則有權(quán)處理帝簇,否則轉(zhuǎn)到下一位
* @author: zxt
* @time: 2019年5月13日 下午9:49:34
*/
public class ConcreteHandler2 extends Handler {
@Override
public void HandleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println(this.getClass().getName() + " 處理請求 " + request);
} else if (successor != null) {
// 轉(zhuǎn)移到下一位
successor.HandleRequest(request);
}
}
}
/**
* @Description: 當(dāng)請求數(shù)在20到30之間則有權(quán)處理徘郭,否則轉(zhuǎn)到下一位
* @author: zxt
* @time: 2019年5月13日 下午9:49:34
*/
public class ConcreteHandler3 extends Handler {
@Override
public void HandleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println(this.getClass().getName() + " 處理請求 " + request);
} else if (successor != null) {
// 轉(zhuǎn)移到下一位
successor.HandleRequest(request);
}
}
}
/**
* @Description: 末端處理器
* @author: zxt
* @time: 2019年5月13日 下午9:49:34
*/
public class ConcreteHandler extends Handler {
@Override
public void HandleRequest(int request) {
System.out.println(this.getClass().getName() + " 處理請求 " + request);
}
}
3、測試
public class Test {
public static void main(String[] args) {
// 設(shè)置職責(zé)鏈的上下家
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
Handler h = new ConcreteHandler();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
h3.setSuccessor(h);
int[] requests = {2, 5, 14, 22, 18, 3, 27, 20, 40};
// 循環(huán)給最小處理者提交請求丧肴,不同的數(shù)額残揉,由不同權(quán)限處理者處理
for(int i = 0; i < requests.length; i++) {
h1.HandleRequest(requests[i]);
}
}
}
職責(zé)鏈模式的好處
??職責(zé)鏈當(dāng)中最關(guān)鍵的是當(dāng)客戶提交一個請求時,請求是沿鏈傳遞直至有一個ConcreteHandler對象負(fù)責(zé)處理它芋浮。 這就使得接收者和發(fā)送者都沒有對方的明確信息抱环,且鏈中的對象自己也并不知道鏈的結(jié)構(gòu)。結(jié)果是職責(zé)鏈可簡化對象的相互連接,它們僅需保持一個指向其后繼者的引用镇草,而不需要保持它所有的候選者的引用眶痰。這也就大大降低了耦合度。
??在客戶端可以隨時地增加或修改處理一個請求的結(jié)構(gòu)陶夜,增強(qiáng)了給對象指派職責(zé)的靈活性凛驮。不過也需要當(dāng)心,一個請求極有可能到了鏈的末端都得不到處理条辟,或者因?yàn)闆]有正確配置而得不到處理黔夭。