責任鏈模式淺析

責任鏈模式簡介:
責任鏈模式是行爲設計模式之一,使對個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞請求,直到對象處理它爲止。

責任鏈模式使用場景:
1. 多個對象可以處理同一請求,但是具體由那個對象處理則在運動時動態決定。
2. 在請求處理者不明確的情況下向多個對象中的一個提交請求。
3. 需要動態指定一組對象處理請求的

UML圖
這裏寫圖片描述

具體使用實例:

//抽象請求者
public abstract class AbstractRequest {

    /**
     * 權限
     * @return
     */
    public abstract int getRequestLevel();

}

//處理者具體實例

//抽象處理者
public abstract class AbstractHandler {

    /**
     * 下一個處理對象
     */
    public AbstractHandler mNextHandler;

    public abstract void handleRequest(AbstractRequest request);

    public abstract int handleRequestLevel();
}
public class ConcreteHandler1 extends AbstractHandler {
    @Override
    public void handleRequest(AbstractRequest request) {

        //請求者的請求的級別
        int level = request.getRequestLevel();
        if (level <= handleRequestLevel()) {
            System.out.println("ConcreteHandler1 處理請求!");
        } else {
            mNextHandler.handleRequest(request);
        }
    }

    @Override
    public int handleRequestLevel() {
        return 2000;
    }
}
public class ConcreteHandler2 extends AbstractHandler {
    @Override
    public void handleRequest(AbstractRequest request) {

        //請求者任務的級別
        int level = request.getRequestLevel();
        if (level <= handleRequestLevel()) {
            System.out.println("ConcreteHandler2 處理請求");
        } else {
            mNextHandler.handleRequest(request);
        }
    }

    @Override
    public int handleRequestLevel() {
        return 5000;
    }
}

//請求者具體實例

public class ConcreteRequest1 extends AbstractRequest {

    @Override
    public int getRequestLevel() {
        return 200;
    }
}
public class ConcreteRequest2 extends AbstractRequest {

    @Override
    public int getRequestLevel() {
        return 2020;
    }
}

//實際調用場景

  public static void main(String[] args) {

        //創建處理者1鏈條
        ConcreteHandler1 handler1 = new ConcreteHandler1();
        //創建處理者2鏈條
        ConcreteHandler2 handler2 = new ConcreteHandler2();
        //串聯鏈條
        handler1.mNextHandler = handler2;

        //請求者1
        ConcreteRequest1 request1 = new ConcreteRequest1();
        //請求者2
        ConcreteRequest2 request2 = new ConcreteRequest2();

        //從handler1開始處理
        handler1.handleRequest(request1);
        handler1.handleRequest(request2);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章