將能夠處理同一類請求的對象形成一條鏈,所提交的請求沿著鏈傳遞,鏈上的對象逐個判斷是否有能力處理該請求 如果能則處理,否則傳遞給下一個對象。 例如:公司行政審批流程,鬥地主游戲,田徑項目中接力運動等。都是責任鏈模式 的運用。 責任鏈可能是一條直線,一個環鏈或者是一個樹結構的一部分。 責任鏈涉及角色: ...
將能夠處理同一類請求的對象形成一條鏈,所提交的請求沿著鏈傳遞,鏈上的對象逐個判斷是否有能力處理該請求
如果能則處理,否則傳遞給下一個對象。
例如:公司行政審批流程,鬥地主游戲,田徑項目中接力運動等。都是責任鏈模式 的運用。
責任鏈可能是一條直線,一個環鏈或者是一個樹結構的一部分。
責任鏈涉及角色:
抽象處理者角色(Handler):定義一個處理請求的介面。可以定義一個方法返回對下家對象的引用。
具體處理者角色(ConcreteHandler):具體處理者接到請求後,可以處理該請求或者將請求傳給下家。
例子:
模擬一個請假處理流程
/**
* 領導
* 抽象類
*/
public abstract class Leader {
//子類實現
protected String name;
//下一個責任鏈對象
protected Leader next;
//處理請求抽象方法
abstract void HandleLeaveNotes(LeaveNote note);
public Leader(String name) {
this.name = name;
}
public Leader(String name, Leader next) {
this.name = name;
this.next = next;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Leader getNext() {
return next;
}
public void setNext(Leader next) {
this.next = next;
}
}
** * 請假條 */ public class LeaveNote { private String departMent; private String name; private Integer days; private String reason; //...get set }
/**
* 部門領導
*/
public class DepartManager extends Leader {
public DepartManager(String name) {
super(name);
}
@Override
void HandleLeaveNotes(LeaveNote note) {
//假如小於3天部門經理有許可權
if(note.getDays()<3){
System.out.println("批准假條: "+ note.getName());
}else{
//否則移交到上級領導
this.next.HandleLeaveNotes(note);
}
}
}
/**
* 經理
*/
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
void HandleLeaveNotes(LeaveNote note) {
//假如大於3天小於7天經理有許可權
if (note.getDays() >= 3 && note.getDays() <= 7) {
System.out.println("批准假條: " + note.getName());
} else {
//否則移交到老闆
this.next.HandleLeaveNotes(note);
}
}
}
/**
* 老闆
*/
public class Boss extends Leader {
public Boss(String name) {
super(name);
}
@Override
void HandleLeaveNotes(LeaveNote note) {
System.out.println("批准假條: "+ note.getName());
}
}
public class Client { public static void main(String[] args) { // LeaveNote note = new LeaveNote(); note.setDays(5); // note.setDays(10); // note.setDays(20); note.setName("tom"); Leader a = new DepartManager("部門領導"); Leader b = new Manager("總經理"); Leader c = new DepartManager("老闆"); //責任鏈關係 a.setNext(b); b.setNext(c); //處理請假業務 a.HandleLeaveNotes(note); } }
責任鏈模式在處理這種多級業務時可以很好使代碼解耦。想新增責任處理對象時只需要增加責任處理對象,不需要更改原來的業務員代碼,更加不需要寫if..else.