一個有問題的責任鏈模式

先上出概念圖:

 圖中主要是2個接口 : 

MyExecutor: 主要包含執行方法(可以理解未一個處理請求的方法,擴展時請求可以定義爲一個對象)
MyExecutorChain: 主要包含新增 執行器方法 和 另一個執行方法(遍歷執行器去調用執行器的執行方法)
MyDefaultExecutorChain: 主要是一個 鏈表集合LinkedList(包含了多個執行器) + 一個索引(也可以理解爲遊標: 用於標識當前處理請求的執行器)

具體內容如下: 內部還有多個點有問題: 僅僅作爲理解責任鏈模式的一個demo:

public interface MyExecutor {
    /**
     * 處理請求方法
     */
    int run(MyExecutorChain myExecutorChain);
}
public interface MyExecutorChain<T> {
    MyExecutorChain add(MyExecutor myExecutor);

    /**
     * 添加處理對象: 返回處理請求結果
     *  0 : 表示成功
     *  1 : 表示失敗
     *  2 : 表示沒有結果
     */
    int exec(T request);
}
public class Request {
    private String requestStr;
}
public class WorldMyDefaultExecutorChain extends AbstractExecutor {

    public WorldMyDefaultExecutorChain(Request request) {
        super(request);
    }

    @Override
    public int run(MyExecutorChain myExecutorChain) {
        System.out.println(" World (項目經理) 接收請求:  " + request.toString());
        System.out.println(" World (項目經理) 處理請求:  " + request.toString());
        if(request.toString().contains("原因")) {
            return myExecutorChain.exec(request);
        } else {
            System.out.println("World (項目經理) 處理結果:  " + "請假未寫明原因,請寫清楚請假原因.");
            return 1;
        }

    }
}
public class LandyMyDefaultExecutorChain extends AbstractExecutor {

    public LandyMyDefaultExecutorChain(Request request) {
        super(request);
    }

    @Override
    public int run(MyExecutorChain myExecutorChain) {
        //處理邏輯
        System.out.println(" Landy(組長) 接收請求:  " + request.toString());
        System.out.println(" Landy(組長) 處理請求:  " + request.toString());
        //如果同意的話就繼續往下傳遞: 3天時間超過權限
        if(request.toString().contains("三")) {
            System.out.println("Landy(組長) 處理結果:  " + "請假時間超過權限,轉到項目經理.");
            return myExecutorChain.exec(super.request);
        } else {
            return 1;
        }
    }
}
public abstract class AbstractExecutor implements MyExecutor {

    //使用protected 限制訪問範圍 : 同時不用提供外部訪問方法: 因爲只需要將該對象在鏈路上傳遞就可以l
    protected Request request;

    public AbstractExecutor(Request request) {
        this.request = request;
    }
}
public class Test {
    public static void main(String[] args) {
        Request request = new Request();
        request.setRequestStr("我想請假,三天,請批准..............");
        Request request1 = new Request();
        request1.setRequestStr("我想請假,兩天,請批准..............原因是: 想請假.....");
        MyDefaultExecutorChain chain = new MyDefaultExecutorChain();
        LandyMyDefaultExecutorChain landyMyDefaultExecutorChain = new LandyMyDefaultExecutorChain(request);
        WorldMyDefaultExecutorChain worldMyDefaultExecutorChain = new WorldMyDefaultExecutorChain(request);
        chain.add(landyMyDefaultExecutorChain);
        chain.add(worldMyDefaultExecutorChain);
        int result = chain.exec(request);
        System.out.println("最終處理結果.......................如下................");
        if(result == 0) {
            System.out.println("請求處理成功!");
        }
        if(result == 1) {
            System.out.println("請求被拒絕!");
        } else {
            System.out.println("請求處理沒有結果,請重新發起申請!");
        }
    }
}

最後上出責任鏈模式的基本概念: 

責任鏈模式(Chain of Responsibility Pattern)是一種常見的行爲模式。

責任鏈模式英文原話是:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving object and pass the request along the chain until an object handles it.

翻譯:使多個對象都有處理請求的機會,從而避免了請求的發送者和接收者之間的耦合關係。將這些對象串成一條鏈,並沿着這條鏈一直傳遞該請求,直到有對象處理它爲止。

責任鏈模式的重點在“鏈上”,由一條鏈去處理相似的請求,在鏈中決定誰來處理這個請求,並返回相應的結果。

角色:

抽象處理者(Handler)角色:該角色對請求進行抽象,並定義一個方法來設定和返回對下一個處理者的引用。

具體處理者(Concrete Handler):該角色接到請求後,可以選擇將請求處理掉,或者將請求傳給下一個處理者。由於具體處理者持有對下一個處理者的引用,因此,如果需要,處理者可以訪問下一個處理者。

內容暫時如上, 不足的地方還在改正!

下一節上一個具體的一個用例子!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章