在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責任鏈(Chain of Responsibility)模式的:java
責任鏈模式是一種對象的行爲模式。在責任鏈模式裏,不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪個對象最終處理這個請求,這使得系統能夠在不影響客戶端的狀況下動態地從新組織和分配責任。web
責任鏈模式涉及到的角色以下所示:ide
1 抽象處理者(Handler)角色:定義出一個處理請求的接口。若是須要,接口能夠定義 出一個方法以設定和返回對下家的引用。
2 具體處理者(ConcreteHandler)角色:具體處理者接到請求後,能夠選擇將請求處理掉,或者將請求傳給下家。因爲具體處理者持有對下家的引用,所以,若是須要,具體處理者能夠訪問下家。this
舉一個簡單的例子,部門辦活動須要報銷。報銷處職員能夠處理單次500元如下的業務,超過500須要和處長聯繫。而處長只能處理單次1000元一下的業務,再高就只能找老大報了。可是老大目前只能處理單次1500元如下的業務,再高目前只能拒絕報銷了。code
這個例子的具體實現爲:對象
抽象類Handlerblog
public abstract class Handler { protected Handler nextHandler = null; public Handler getNextHandler() { return nextHandler; } public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } public abstract String dispose(String user , double fee); }
職員類:接口
public class StaffMember extends Handler { @Override public String dispose(String user, double fee) { if(fee < 500){ System.out.println("職員 給了 "+user+" "+fee+"元"); }else if (super.getNextHandler() == null){ System.out.println("誰都處理不了 "+user+" 要 "+fee+"元的事情"); }else { super.getNextHandler().dispose(user,fee); } return null; } }
處長類:開發
public class SectionChief extends Handler { @Override public String dispose(String user, double fee) { if(fee < 1000){ System.out.println("小主管 給了 "+user+" "+fee+"元"); }else if (super.getNextHandler() == null){ System.out.println("誰都處理不了 "+user+" 要 "+fee+"元的事情"); }else { super.getNextHandler().dispose(user,fee); } return null; } }
老大類:get
public class Director extends Handler { @Override public String dispose(String user, double fee) { if(fee < 5000){ System.out.println("老大 給了 "+user+" "+fee+"元"); }else if (super.getNextHandler() == null){ System.out.println("誰都處理不了 "+user+" 要 "+fee+"元的事情"); }else { super.getNextHandler().dispose(user,fee); } return null; } }
Main方法:
public class Main { public static void main(String[] args){ StaffMember staffMember = new StaffMember(); SectionChief sectionChief = new SectionChief(); Director director = new Director(); //set Handler staffMember.setNextHandler(sectionChief); sectionChief.setNextHandler(director); staffMember.dispose("小王",400); staffMember.dispose("小混混",800); staffMember.dispose("老李",1200); staffMember.dispose("小明",10000); } }
最後的結果就是:
純責任鏈模式和不純的責任鏈模式
若是一個類要麼承擔責任處理請求要麼將請求踢給下一個皮球,則被稱爲純責任鏈模式。
若是一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱爲不純的責任鏈模式。
通常來講,平常開發中不純的責任鏈模式用的比較多一點。
參考:
http://www.codeweblog.com/java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3/