Android設(shè)計(jì)模式之(8)----責(zé)任鏈模式

責(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)求判斷一定程度損失性能

github代碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容