責任鏈模式
責任鏈模式一般分為處理者與請求者。具體的處理者分別處理請求者的行為。
Android中的時間分發機制就屬于一種責任鏈模式,父View包含N個子View,如果父View不處理的內容就會分發到具體的子View上進行,直到處理為止。
應用場景
- 處理者不明確的情況下,提交了一條任務
- 多個請求者請求行為一樣,交由處理中處理
代碼示例
列如小說中經常有一系列賞金任務,分為普通難度,中等難度,高等難度的任務,對應的任務有具體的普通難度處理人,中等難度處理人,高等難度處理人那么問題來了。
(1)不清楚任務難度的情況要交由對應處理者應該如何處理
(2)當接受了高等難度的任務時向普通難度的人提交,但普通難度處理者并不能處理,應該向上級提交到高等難度處理者
(一)抽象的任務處理者
public abstract class TaskLeader {
public TaskLeader companyLeader;
public abstract int getType();
public abstract void handle(TaskRequest type);
public void handleRequest(TaskRequest companyRequest) {
//請求者的狀態與處理者的狀態一致直接處理
if (companyRequest.getRequestType() == getType()) {
handle(companyRequest);
} else {
if (companyLeader != null) {//交給上級處理
companyLeader.handleRequest(companyRequest);
} else {
System.out.println("沒有人能處理");
}
}
}
}
TaskRequest:抽象的任務請求者
getType():請求者狀態或者說標識
(二)抽象的任務請求者
public abstract class TaskRequest {
private Object obj;
public TaskRequest(Object obj) {
this.obj = obj;
}
public Object getContent() {
return obj;
}
public abstract int getRequestType();
}
(三)具體難度的任務請求者
- 普通難度
public class NormalRequest extends TaskRequest {
public NormalRequest(Object obj) {
super(obj);
}
@Override
public int getRequestType() {
return return (int) getContent();
}
}
- 中等難度
public class MiddleRequest extends TaskRequest {
public MiddleRequest(Object obj) {
super(obj);
}
@Override
public int getRequestType() {
return return (int) getContent();
}
}
- 高等難度
public class HardRequest extends TaskRequest {
public HardRequest(Object obj) {
super(obj);
}
@Override
public int getRequestType() {
return return (int) getContent();
}
}
(三)具體難度的任務處理者
- 普通難度
public class NormalHandle extends TaskLeader {
@Override
public int getType() {
return TypeConfig.NORMAL;
}
@Override
public void handle(TaskRequest type) {
System.out.println("普通難度請求");
}
}
- 中等難度
public class MiddleHandle extends TaskLeader {
@Override
public int getType() {
return TypeConfig.MIDDEL;
}
@Override
public void handle(TaskRequest type) {
System.out.println("中等難度請求");
}
}
- 高等難度
public class HardHandle extends TaskLeader {
@Override
public int getType() {
return TypeConfig.HARD;
}
@Override
public void handle(TaskRequest type) {
System.out.println("高等難度請求");
}
}
(四)調用方式
//構造三個處理對象
NormalHandle handler1 = new NormalHandle();
MiddleHandle handler2 = new MiddleHandle();
HardHandle handler3 = new HardHandle();
//串成一個責任鏈
handler1.companyLeader=handler2;
handler2.companyLeader=handler3;
//構造三個請求
NormalRequest request1 = new NormalRequest(TypeConfig.NORMAL);
MiddleRequest request2 = new MiddleRequest(TypeConfig.MIDDEL);
HardRequest request3 = new HardRequest(TypeConfig.HARD);
handler1.handleRequest(request1);
handler1.handleRequest(request2);
handler1.handleRequest(request3);
(五)顯示結果
普通難度請求
中等難度請求
高等難度請求
三個請求分別都交到了對應的處理者身上。
總結
優點:責任鏈模式耦合低,利于維護擴展。責任鏈相互連接,只用頂層發送請求
缺點:責任鏈判斷需要時間,復雜的請求判斷一定程度損失性能