定義:責任鏈模式(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模式,在代碼修改和整合上有更高的效率,更利于代碼維護。而且,需要增加責任鏈中的對象時,需要在再實現一個具體的責任鏈類,然后創建責任對象,并維護責任鏈關系就行,不需要更大的開銷,而且在實際設計中,我們很多時候責任鏈的維護都在配置文件中進行,這樣我們將節省更多的開發時間。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答