設計模式(9)-責任鏈模式詳解(易懂)

責任鏈模式的定義

責任鏈模式是一種設計模式。在責任鏈模式裏,不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪個對象最終處理這個請求,這使得系統能夠在不影響客戶端的狀況下動態地從新組織和分配責任。設計模式

模型:bash

image

  • Hander:抽象處理者微信

  • ConcreteHander:具體處理者ide

下面模型代碼以下:性能

1.設計等級類ui

public class Level {
    private  int level=1;

    public  Level(int level){
        this.level=level;
    }

    public int getLevel() {
        return level;
    }
}

複製代碼

2.請求類this

public class MyRequest {

    Level level;
    public  MyRequest(Level level){
        this.level=level;
    }
    public int  getLevel(){

        return level.getLevel();
    }

}

複製代碼

3.響應類spa

public class Response {
    private String message;
    public Response(String message) {
        Log.d("qzs","處理完成");
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}

複製代碼

4.抽象處理者類設計

public abstract class AbstractHandler  {
    //判斷下一個處理者是誰
    private AbstractHandler nextHandler = null;

    public final Response handlerRequest(MyRequest request) {
        Response response = null;

        if(this.getHandlerLevel()==request.getLevel()) {
            response = this.response(request);
        }else {
            if(this.nextHandler != null) {
                Log.d("qzs","轉到下一個處理者中...");
                response = this.nextHandler.handlerRequest(request);
            }else {
           Log.d("qzs","後面沒有處理請求了...");
            }
        }
        return response;
    }
    public void setNextHandler(AbstractHandler handler) {
        nextHandler = handler;
    }
    //拿到等級
    protected abstract int getHandlerLevel();
    //響應
    protected abstract Response response(MyRequest request);
}

複製代碼

5.定義具體的處理者,這裏就定義了兩個:3d

public class ConcreteHandlerA extends AbstractHandler {
    @Override
    protected int getHandlerLevel() {
        return 0;
    }

    @Override
    protected Response response(MyRequest request) {
        Log.d("qzs","正在處理中「ConcreteHandlerA");
        return new Response("響應處理結果A") ;
    }
}

public class ConcreteHandlerB extends AbstractHandler {
    @Override
    protected int getHandlerLevel() {
        return 1;
    }

    @Override
    protected Response response(MyRequest request) {
        Log.d("qzs","正在處理中「ConcreteHandlerB");
        return new Response("響應處理結果B") ;
    }
}

複製代碼

6.調用:

前提是A到B組成了一個鏈,而且上面A的等級是0,B是1;發出的請求先通過A若是不能處理就交給B:

AbstractHandler handler1=new ConcreteHandlerA();
        AbstractHandler handler2=new ConcreteHandlerB();
        //A到B組成一個鏈
        handler1.setNextHandler(handler2);
        Response response=handler1.handlerRequest(new MyRequest(new Level(1)));

複製代碼

上面代碼我傳送的等級是1,結果應該是由B解決的,下面是運行結果:

image

若是你傳入的等級不在A和B的範圍,運行結果以下:

image

說明沒有適合的了。


實例說明

若是上面的定義不是很明白,下面直接實例說明一下。

例子:家裏的小孩想出去玩,須要請示一下,這裏規定一級請示爸爸,爸爸贊成了就能夠出去玩了;若是爸爸不在家就請示(二級)媽媽,媽媽贊成了也能夠出去玩;若是都不在家就不容許出去玩。

1.編寫等級類,響應類,請求類,這些都沒有變化能夠直接去上面看就能夠了。

2.抽象處理類:

public abstract class AbstractHandler  {
    //判斷下一個處理者是誰
    private AbstractHandler nextHandler = null;

    public final Response handlerRequest(MyRequest request) {
        Response response = null;

        if(this.getHandlerLevel()==request.getLevel()) {
            response = this.response(request);
        }else {
            if(this.nextHandler != null) {
                Log.d("qzs","轉到下一個處理者中...");
                response = this.nextHandler.handlerRequest(request);
            }else {
           Log.d("qzs","爸爸媽媽不在家...");
            }
        }
        return response;
    }
    public void setNextHandler(AbstractHandler handler) {
        nextHandler = handler;
    }
    //拿到等級
    protected abstract int getHandlerLevel();
    //響應
    protected abstract Response response(MyRequest request);
}

複製代碼

3.具體處理者,也就是爸爸和媽媽:

public class Father extends AbstractHandler {
    @Override
    protected int getHandlerLevel() {
        return 1;
    }

    @Override
    protected Response response(MyRequest request) {
        Log.d("qzs","正在處理中「Father」");
        Log.d("qzs","爸爸贊成孩子出去玩了");
        return  new Response("") ;
    }
}

public class Mother extends  AbstractHandler{
    @Override
    protected int getHandlerLevel() {
        return 2;
    }

    @Override
    protected Response response(MyRequest request) {
        Log.d("qzs","正在處理中「Mother」");
        Log.d("qzs","媽媽贊成孩子出去玩了");
        return new Response("") ;
    }
}

複製代碼

4.調用

若是傳入的等級1:

AbstractHandler handler1=new Father();
        AbstractHandler handler2=new Mother();
        //先問爸爸,爸爸不在家再問媽媽
        handler1.setNextHandler(handler2);
        Response response=handler1.handlerRequest(new MyRequest(new Level(1)));

複製代碼

運行結果:

image

傳入其餘的等級也能夠,這個你們能夠本身去試一試。

責任鏈模式的優缺點及其餘

1.優勢

  • 耦合度下降,請求和處理是分開的

2.缺點

  • 責任鏈太長或者每條鏈判斷處理的時間太長會影響性能。特別是遞歸循環的時候

  • 不必定被處理,每一個職責類的職責很明確,這就須要對寫默認的處理了

責任鏈模式重要的兩點:分離職責,動態組合

本文部分定義參考了網上博文和網上信息...


你們能夠關注個人微信公衆號:「安卓乾貨鋪」一個有質量、有態度的公衆號!

相關文章
相關標籤/搜索