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