一洋闽、模式簡介
定義:為了避免請求發(fā)送者與多個(gè)請求處理者耦合在一起,將所有請求的處理者通過前一對象記住其下一個(gè)對象的引用而連成一條鏈宙址;當(dāng)有請求發(fā)生時(shí),可將請求沿著這條鏈傳遞兢仰,直到有對象處理它為止。
場景:有多個(gè)對象可以處理一個(gè)請求剂碴,哪個(gè)對象處理該請求由運(yùn)行時(shí)刻自動確定把将。可動態(tài)指定一組對象處理請求忆矛,或添加新的處理者察蹲。在不明確指定請求處理者的情況下,向多個(gè)處理者中的一個(gè)提交請求催训。
- 角色結(jié)構(gòu):
- 抽象處理者(Handler)角色:定義一個(gè)處理請求的接口洽议,包含抽象處理方法和一個(gè)后繼連接。
- 具體處理者(Concrete Handler)角色:實(shí)現(xiàn)抽象處理者的處理方法漫拭,判斷能否處理本次請求亚兄,如果可以處理請求則處理,否則將該請求轉(zhuǎn)給它的后繼者采驻。
- 客戶端(Client)角色:創(chuàng)建處理鏈审胚,并向鏈頭的具體處理者對象提交請求,它不關(guān)心處理細(xì)節(jié)和請求的傳遞過程礼旅。
二膳叨、模式實(shí)現(xiàn)
public abstract class AbstractHandler { -> 抽象處理者
private AbstractHandler next;
public AbstractHandler getNext() {
return next;
}
public void setNext(AbstractHandler next) {
if(this.next != null){
next.next = this.next;
}
this.next = next;
}
public abstract void handle(String department);
}
public class AdminConcreteHandler extends AbstractHandler { -> 具體處理者
@Override
public void handle(String department) {
System.out.println("請求經(jīng)過行政部");
if ("admin".equals(department)) {
System.out.println("行政部處理請求");
} else {
if (getNext() != null) {
getNext().handle(department);
}
}
}
}
public class SaleConcreteHandler extends AbstractHandler { -> 具體處理者
@Override
public void handle(String department) {
System.out.println("請求經(jīng)過銷售部");
if ("sale".equals(department)) {
System.out.println("銷售部處理請求");
} else {
if (getNext() != null) {
getNext().handle(department);
}
}
}
}
public class TechnicalConcreteHandler extends AbstractHandler {
@Override
public void handle(String department) {
System.out.println("請求經(jīng)過技術(shù)部");
if ("technical".equals(department)) {
System.out.println("技術(shù)部處理請求");
} else {
if (getNext() != null) {
getNext().handle(department);
}
}
}
}
以尋求公司的某個(gè)部門協(xié)助為例子,各個(gè)部門串聯(lián)形成責(zé)任鏈痘系,符合條件則截獲請求并完成菲嘴,否則流向下一個(gè)部門,執(zhí)行相同的步驟汰翠,直至符合條件為止龄坪。
AbstractHandler technical = new TechnicalConcreteHandler();
AbstractHandler sale = new SaleConcreteHandler();
AbstractHandler admin = new AdminConcreteHandler(); -> 客戶端
admin.setNext(technical);
admin.setNext(sale);
admin.handle("technical");