/**
* 責任鏈模式
* 責任鏈(Chain of Responsibility)模式的定義:為了避免請求發(fā)送者與多個請求處理者耦合在一起及穗,于是將所有請求的處理者通過前一對象記住其下一個對象的引用而連成一條鏈蜕径;
* 當有請求發(fā)生時静暂,可將請求沿著這條鏈傳遞,直到有對象處理它為止秆剪。
* <p>
* 注意:責任鏈模式也叫職責鏈模式妈嘹。
* <p>
* 在責任鏈模式中成黄,客戶只需要將請求發(fā)送到責任鏈上即可缚态,無須關(guān)心請求的處理細節(jié)和請求的傳遞過程,請求會自動進行傳遞趟章。
* 所以責任鏈將請求的發(fā)送者和請求的處理者解耦了杏糙。
* <p>
* 責任鏈模式是一種對象行為型模式
* <p>
* 優(yōu)點
* 1.降低了對象之間的耦合度。該模式使得一個對象無須知道到底是哪一個對象處理其請求以及鏈的結(jié)構(gòu)蚓土,發(fā)送者和接收者也無須擁有對方的明確信息宏侍。
* 2.增強了系統(tǒng)的可擴展性∈衿幔可以根據(jù)需要增加新的請求處理類谅河,滿足開閉原則。
* 3.增強了給對象指派職責的靈活性。當工作流程發(fā)生變化绷耍,可以動態(tài)地改變鏈內(nèi)的成員或者調(diào)動它們的次序吐限,也可動態(tài)地新增或者刪除責任。
* 4.責任鏈簡化了對象之間的連接褂始。每個對象只需保持一個指向其后繼者的引用诸典,不需保持其他所有處理者的引用,這避免了使用眾多的 if 或者 if···else 語句崎苗。
* 5.責任分擔狐粱。每個類只需要處理自己該處理的工作,不該處理的傳遞給下一個對象完成胆数,明確各類的責任范圍肌蜻,符合類的單一職責原則。
* <p>
* 缺點
* 1.不能保證每個請求一定被處理必尼。由于一個請求沒有明確的接收者蒋搜,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理判莉。
* 2.對比較長的職責鏈豆挽,請求的處理可能涉及多個處理對象,系統(tǒng)性能將受到一定影響骂租。
* 3.職責鏈建立的合理性要靠客戶端來保證祷杈,增加了客戶端的復(fù)雜性斑司,可能會由于職責鏈的錯誤設(shè)置而導(dǎo)致系統(tǒng)出錯渗饮,如可能會造成循環(huán)調(diào)用。
* <p>
* android應(yīng)用:Okhttp攔截器
*/
public class ChainTest {
public static void main(String[] args) {
ApprovalChain approvalChain = new ApprovalChain();
approvalChain.addChain(new LeaderChain());
approvalChain.addChain(new HrChain());
approvalChain.addChain(new BossChain());
approvalChain.handleRequest(1);
approvalChain.handleRequest(10);
approvalChain.handleRequest(15);
approvalChain.handleRequest(20);
}
}
/**
* 責任鏈接口
*/
abstract class Chain {
protected Chain next;
abstract void handleRequest(int days);
}
/**
* 模擬請假審批流程責任鏈
*/
public class ApprovalChain extends Chain {
/**
* 添加到責任鏈末尾
*/
void addChain(Chain chain) {
if (next == null) {
next = chain;
return;
}
Chain pre = next;
while (pre.next != null) {
pre = pre.next;
}
pre.next = chain;
}
@Override
void handleRequest(int days) {
next.handleRequest(days);
}
}
/**
* 領(lǐng)導(dǎo)審批
*/
public class LeaderChain extends Chain {
@Override
void handleRequest(int days) {
if (days <= 3) {
System.out.println("領(lǐng)導(dǎo)審批通過");
} else if (next != null) {
next.handleRequest(days);
} else {
System.out.println("審批不通過");
}
}
}
/**
* hr審批
*/
public class HrChain extends Chain {
@Override
void handleRequest(int days) {
if (days <= 10) {
System.out.println("hr審批通過");
} else if (next != null) {
next.handleRequest(days);
} else {
System.out.println("審批不通過");
}
}
}
/**
* 老板審批
*/
public class BossChain extends Chain {
@Override
void handleRequest(int days) {
if (days <= 15) {
System.out.println("老板審批通過");
} else if (next != null) {
next.handleRequest(days);
} else {
System.out.println("審批不通過");
}
}
}