責任鏈模式

責任鏈模式的定義

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

責任鏈模式的使用場景

多個對象能夠處理同一請求, 單具體由哪一個對象處理則在運行時動態決定. 在請求處理者不明確的狀況下向多個對象中的一個提交一個請求, 須要動態指定一組對象處理請求.node

假設一種場景

上游發送一條消息, 下游接收這條消息並跟根據消息類型進行處理.markdown

public class Msg {
    int messageType;
}
public void send() {
    postMsg(msg);
}
複製代碼
不使用責任鏈模式的寫法
public void handleMsg(Msg msg) {
    switch(msg.messageType) {
        case 1:handle1(msg);breack;
        case 2:handle2(msg);breack;
        case 3:handle3(msg);breack;
        ...
    }
}
複製代碼

上面這種寫法, 隨着type類型的增長, switch...case的代碼量也勢必增長, 維護起來也比較麻煩. 若是參考像retrofit中使用的責任鏈模式對請求進行處理, 責任鏈上各個節點各盡其責. 只用關心屬於本身的type的狀況post

使用責任鏈模式
public interface INode {
    boolean handleMsg(Msg msg);
}
public class Node1 implements INode {
    // true: 本身能夠處理, false: 本身不能處理;
    public boolean handleMsg(Msg msg) {
        if (...) {
            return true;
        }
        // 不能處理, 將Msg拋給下一個Node去處理
        return false;
    }
}
public List<Node> nodes = new ArrayList();
public void init() {
    nodes.add(new Node1());
    nodes.add(new Node2());
    nodes.add(new Node3());
}
// 當收到消息時, 遍歷集合, 對Msg進行處理
public void handleMsg(Msg msg) {
    for(int i = 0; i < nodes.size(); i++) {
        if (nodes.get(i).handleMsg(msg)) {
            break;
        }
    }
}
複製代碼

若是有新增的messageType的狀況時, 不須要維護大量的switch...case的代碼, 只須要新增一個Node, 而後將該Node添加到集合中便可, 若是以爲將Node添加到集合中也比較麻煩, 能夠考慮使用註解處理器, 在編譯時, 將被註解的Node自動添加到集合中, 省去了每次新增Node, 將Node添加到集合的操做.spa

相關文章
相關標籤/搜索