无善无恶心之体,有善有恶意之动。知善知恶是良知,为善去恶是格物。
一,定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式比较好理解,可以将它比做为一列火车,每一节车厢都是一个对象,每一个对象都有不同处理逻辑(每一节车厢都有它唯一的座位号),如果我们的座位号12车厢8A号座位,如果我们从一号车厢进去的,需要一节一节的走到12号车厢。
二,使用场景
1,多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定
2,在请求处理者不明确的情况下,向多个对象中的一个提交一个请求
3,需要动态指定一组对象处理请求
三,具体使用
责任链模式在安卓中最典型的应用就是view事件的传递机制,感兴趣的可以去看下源码是怎么实现的,这里就不再展开了。
下面举一个比较好理解的例子。
假设英雄联盟有五个段位,青铜,白银,黄金,铂金,钻石。每个段位匹配都有相应的匹配机制让你匹配到同段位的玩家。
首先需要创建一个匹配机制的抽象类:
/*** 匹配抽象类* */
public abstract class Mate {protected Mate mMate;/*** 设置下一个段位* */public void setNextDan(Mate mate){this.mMate =mate;}/*** 匹配游戏* */public abstract void mateGame(String dan);
}
然后创建具体的匹配机制类:
青铜:
/*** 青铜匹配机制* */
public class BronzeMate extends Mate{@Overridepublic void mateGame(String dan) {if(dan.equals("bronze")){//如果是青铜段位 匹配游戏System.out.println("青铜匹配机制开始匹配游戏");}else {mMate.mateGame(dan);}}
}
白银:
/*** 白银匹配机制* */
public class SilverMate extends Mate{@Overridepublic void mateGame(String dan) {if(dan.equals("silver")){//如果是白银段位 匹配游戏System.out.println("白银匹配机制开始匹配游戏");}else {mMate.mateGame(dan);}}
}
黄金:
/*** 黄金匹配机制* */
public class GoldMate extends Mate{@Overridepublic void mateGame(String dan) {if(dan.equals("gold")){//如果是黄金段位 匹配游戏System.out.println("黄金匹配机制开始匹配游戏");}else {mMate.mateGame(dan);}}
}
铂金:
/*** 铂金匹配机制* */
public class PlatinumMate extends Mate{@Overridepublic void mateGame(String dan) {if(dan.equals("platinum")){//如果是铂金段位 匹配游戏System.out.println("铂金匹配机制开始匹配游戏");}else {mMate.mateGame(dan);}}
}
钻石:
/*** 钻石匹配机制* */
public class DiamondMate extends Mate{@Overridepublic void mateGame(String dan) {if(dan.equals("diamond")){//如果是钻石段位 匹配游戏System.out.println("钻石匹配机制开始匹配游戏");}else {mMate.mateGame(dan);}}
}
创建一个玩家类,包含玩家的段位:
/*** 玩家* */
public class Gamer {/*** 段位* */private String dan;public Gamer(String dan) {this.dan = dan;}public String getDan() {return dan;}
}
具体使用:
BronzeMate bronzeMate =new BronzeMate();
SilverMate silverMate =new SilverMate();
GoldMate goldMate =new GoldMate();
PlatinumMate platinumMate =new PlatinumMate();
DiamondMate diamondMate =new DiamondMate();
bronzeMate.setNextDan(silverMate);
silverMate.setNextDan(goldMate);
goldMate.setNextDan(platinumMate);
platinumMate.setNextDan(diamondMate);
Gamer gamer1 =new Gamer("gold");
bronzeMate.mateGame(gamer1.getDan());
Gamer gamer2 =new Gamer("diamond");
bronzeMate.mateGame(gamer2.getDan());
这里有一个黄金和一位钻石玩家开始了匹配,他们不知道内部的匹配机制,他们只需要都使用青铜机制开始匹配就可以,最后都会匹配到和他们段位相同的选手。
最后输出:
至此,就实现了一个简单的责任链模式。
四,总结
优点:可以对请求者和处理者关系解耦,提高代码的灵活性
缺点:对链中请求处理者的遍历,如果处理者太多,必定会影响性能。
总的来说我们完全可以用责任链模式来代替switch case 或者if else等条件判断语句,不过这样做可能也不会带来更好的收益。