亦稱:職責(zé)鏈模式喂击、命令鏈昼榛、CoR、Chain of Command永丝、Chain of Responsibility
責(zé)任鏈模式是一種行為設(shè)計(jì)模式锹漱,?允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送。?收到請(qǐng)求后慕嚷,?每個(gè)處理者均可對(duì)請(qǐng)求進(jìn)行處理哥牍,?或?qū)⑵鋫鬟f給鏈上的下個(gè)處理者。
假如你正在開發(fā)一個(gè)在線訂購(gòu)系統(tǒng)喝检。?你希望對(duì)系統(tǒng)訪問進(jìn)行限制嗅辣,?只允許認(rèn)證用戶創(chuàng)建訂單。?此外挠说,?擁有管理權(quán)限的用戶也擁有所有訂單的完全訪問權(quán)限澡谭。
簡(jiǎn)單規(guī)劃后,?你會(huì)意識(shí)到這些檢查必須依次進(jìn)行损俭。?只要接收到包含用戶憑據(jù)的請(qǐng)求蛙奖,?應(yīng)用程序就可嘗試對(duì)進(jìn)入系統(tǒng)的用戶進(jìn)行認(rèn)證潘酗。?但如果由于用戶憑據(jù)不正確而導(dǎo)致認(rèn)證失敗,?那就沒有必要進(jìn)行后續(xù)檢查了外永。
與許多其他行為設(shè)計(jì)模式一樣崎脉,?責(zé)任鏈會(huì)將特定行為轉(zhuǎn)換為被稱作處理者的獨(dú)立對(duì)象。?在上述示例中伯顶,?每個(gè)檢查步驟都可被抽取為僅有單個(gè)方法的類囚灼,?并執(zhí)行檢查操作。?請(qǐng)求及其數(shù)據(jù)則會(huì)被作為參數(shù)傳遞給該方法祭衩。
模式建議你將這些處理者連成一條鏈灶体。?鏈上的每個(gè)處理者都有一個(gè)成員變量來保存對(duì)于下一處理者的引用。?除了處理請(qǐng)求外掐暮,?處理者還負(fù)責(zé)沿著鏈傳遞請(qǐng)求蝎抽。?請(qǐng)求會(huì)在鏈上移動(dòng),?直至所有處理者都有機(jī)會(huì)對(duì)其進(jìn)行處理路克。
最重要的是:?處理者可以決定不再沿著鏈傳遞請(qǐng)求樟结,?這可高效地取消所有后續(xù)處理步驟。
在我們的訂購(gòu)系統(tǒng)示例中精算,?處理者會(huì)在進(jìn)行請(qǐng)求處理工作后決定是否繼續(xù)沿著鏈傳遞請(qǐng)求瓢宦。?如果請(qǐng)求中包含正確的數(shù)據(jù),?所有處理者都將執(zhí)行自己的主要行為灰羽,?無論該行為是身份驗(yàn)證還是數(shù)據(jù)緩存驮履。
責(zé)任鏈模式結(jié)構(gòu)
Java 示例代碼:
public class ChainOfResponsibilityPattern {
? ? public static void main(String[] args) {
? ? ? ? Handler fudaoyuan = new FuDaoYuan();
? ? ? ? Handler yuanzhang = new YuanZhang();
? ? ? ? Handler xiaozhang = new XiaoZhang();
? ? ? ? fudaoyuan.setNext(yuanzhang);
? ? ? ? yuanzhang.setNext(xiaozhang);
? ? ? ? fudaoyuan.HandlerRequest(31);
? ? }
}
abstract class Handler {
? ? protected Handler next;
? ? public void setNext(Handler next) {
? ? ? ? this.next = next;
? ? }
? ? public abstract void HandlerRequest(int request);
}
class FuDaoYuan extends Handler { // <= 7 審批
? ? @Override
? ? public void HandlerRequest(int request) {
? ? ? ? if (request <= 7) {
? ? ? ? ? ? System.out.println("輔導(dǎo)員審批通過");
? ? ? ? } else {
? ? ? ? ? ? if (next != null) {
? ? ? ? ? ? ? ? next.HandlerRequest(request);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? System.out.println("無法審批");
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
class YuanZhang extends Handler { // <= 15 審批
? ? @Override
? ? public void HandlerRequest(int request) {
? ? ? ? if (request <= 15) {
? ? ? ? ? ? System.out.println("院長(zhǎng)審批通過");
? ? ? ? } else {
? ? ? ? ? ? if (next != null) {
? ? ? ? ? ? ? ? next.HandlerRequest(request);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? System.out.println("無法審批");
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
class XiaoZhang extends Handler { // <= 30 審批
? ? @Override
? ? public void HandlerRequest(int request) {
? ? ? ? if (request <= 30) {
? ? ? ? ? ? System.out.println("校長(zhǎng)審批通過");
? ? ? ? } else {
? ? ? ? ? ? if (next != null) {
? ? ? ? ? ? ? ? next.HandlerRequest(request);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? System.out.println("無法審批");
? ? ? ? ? ? }
? ? ? ? }
? ? }
}