責任鏈模式:多個對象由其對象對應下家的引用連成一條鏈,請求在這個鏈上傳遞,直到 鏈上的某一個接收對象處理此請求。因為請求的客戶端并不知道鏈上最終是誰來處理這個請求,使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任, 從而避免了請求發送者與請求處理者之間的耦合。
責任鏈械中涉及到三種角色:
1,抽象處理者角色
2,具體處理者角色
3,請求發送者
小例子:假設去買房子,買房子就需要砍價, 賣房的人職位不同,可以優惠的價格也不同,不同職位就可以形成一個處理請求的鏈。我們暫定: * 基層銷售員,只能優惠3% * 銷售經理:可以優惠5% * 銷售總監:可以優惠8% * 老板(Boss):優惠10%
Java實例
類圖:

/** * 抽象責任 */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this.successor = successor; } public abstract void handleFilter(); public abstract void handleFilter2(); } /** * 具體責任 */ public class ConcreteFilter extends IFilter { private String name; public ConcreteFilter(String name) { this.name = name; } @Override public void handleFilter() { /* * 自己先處理,如有后繼者,再由它處理一次 */ System.out.println(name + " 處理了請求"); if (getSuccessor() != null) { getSuccessor().handleFilter(); } } @Override public void handleFilter2() { /* * 有后繼者就后繼者處理, 否則自己處理 */ if (getSuccessor() != null) { getSuccessor().handleFilter2(); } else { System.out.println(name + " 處理了請求"); } } } public class Test { public static void main(String[] args) { IFilter filter1 = new ConcreteFilter("permission-filter");//權限過濾 IFilter filter2 = new ConcreteFilter("suffix-filter");//后綴名過濾 IFilter filter3 = new ConcreteFilter("style-filter");//風格過濾 filter1.setSuccessor(filter2); filter2.setSuccessor(filter3); System.out.println("------以下是每一個處理者(包括后繼者)都處理了, 順序也是一級一級的傳遞------"); filter1.handleFilter(); System.out.println("------以下是交由最后一個后繼者處理------"); filter1.handleFilter2(); } } 打印:
------以下是每一個處理者(包括后繼者)都處理了, 順序也是一級一級的傳遞------ permission-filter 處理了請求 suffix-filter 處理了請求 style-filter 處理了請求 ------以下是交由最后一個后繼者處理------ style-filter 處理了請求
新聞熱點
疑難解答