使多个对象都有机会处理请求, 从而避免了请求的发送者和接收者之间的耦合关系, 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有对象处理它为止.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