定義:責任鏈模式(Chain of Responsibility Pattern)為請求建立了一個接收者對象的鏈。這種模式給予請求的類型,對請求的寄件者和接收者進行解耦。這種類型的設計模式屬於行為型模式。在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。
特點:1、降低耦合度。它將請求的寄件者和接收者解耦。
2、簡化了對象。使得對象不需要知道鏈的結構。
3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。
4、增加新的請求處理類很方便。
企業級開發和常用架構中的應用:spring,struts的攔截器,servlet的過濾器
具體執行個體:
/** *這裡以公司請假舉例: *1、某人請假(事件) *2、項目組長審批:小於三天可以審批,大於三天請示上級 *3、部門主管審批:小於十天可以審批,大於十天請示上級 *4、總經理審批 :小於30天可以審批,大於30天不批准 */public class Demo { public static void main(String[] args) { Event event = new Event("程式員", 32, "回老家探親"); Leader a = new GroupLeader("張三"); Leader b = new Manager("李四"); Leader c = new GeneralManager("王五"); //指定責任鏈模式 a.setNextLeader(b); b.setNextLeader(c); a.handler(event); }}/** * 事件對象,責任鏈中的具體處理事件 * 該執行個體中即為請假這件事兒 */class Event{ private String name; private int days; private String reason; public Event(String name, int days, String reason) { super(); this.name = name; this.days = days; this.reason = reason; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDays() { return days; } public void setDays(int days) { this.days = days; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; }}/** * 抽象責任鏈對象,後面的所有實際責任鏈對象繼承自該對象 */abstract class Leader{ private String name; protected Leader nextLeader;//責任鏈中的下一個責任對象,這是讓責任鏈持續下去的基礎 public Leader(String name) { super(); this.name = name; } public void setNextLeader(Leader nextLeader) { this.nextLeader = nextLeader; } public String getName() { return name; } public void setName(String name) { this.name = name; } protected abstract void handler(Event event);}/** * 請假流程中的第一個對象,組長 */class GroupLeader extends Leader{ public GroupLeader(String name) { super(name); } protected void handler(Event event) { if(event.getDays() < 3){ System.out.println("--------------------請假條--------------------"); System.out.print("| 請假人:"+event.getName()+" | "); System.out.println("請假天數:"+event.getDays()+"天"+" |"); System.out.println("| 請假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(組長),通過!"); System.out.println(); }else{ System.out.println(this.getName()+"(主管),沒有許可權!"); this.nextLeader.handler(event); } }}/** * 請假流程中的第二個對象,部門主管 */class Manager extends Leader{ public Manager(String name) { super(name); } protected void handler(Event event) { if(event.getDays() < 10){ System.out.println("--------------------請假條--------------------"); System.out.print("| 請假人:"+event.getName()+" | "); System.out.println("請假天數:"+event.getDays()+"天"+" |"); System.out.println("| 請假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(主管),請假通過!"); System.out.println(); }else{ System.out.println(this.getName()+"(總經理),沒有許可權!"); this.nextLeader.handler(event); } }}/** * 請假流程中的第三個對象,總經理 */class GeneralManager extends Leader{ public GeneralManager(String name) { super(name); } protected void handler(Event event) { if(event.getDays() < 30){ System.out.println("--------------------請假條--------------------"); System.out.print("| 請假人:"+event.getName()+" | "); System.out.println("請假天數:"+event.getDays()+"天"+" |"); System.out.println("| 請假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(總經理)"); System.out.println(); }else{ System.out.println("--------------------請假條--------------------"); System.out.print("| 請假人:"+event.getName()+" | "); System.out.println("請假天數:"+event.getDays()+"天"+" |"); System.out.println("| 請假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(總經理),請假人不通過!"); System.out.println(); } }}
責任鏈模式主要用於流程式控制制這一類的開發,相比較於單純用if-else模式,在代碼修改和整合上有更高的效率,更利於代碼維護。而且,需要增加責任鏈中的對象時,需要在再實現一個具體的責任鏈類,然後建立責任對象,並維護責任鏈關係就行,不需要更大的開銷,而且在實際設計中,我們很多時候責任鏈的維護都在設定檔中進行,這樣我們將節省更多的開發時間。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。