无善无恶心之体,有善有恶意之动。知善知恶是良知,为善去恶是格物。
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式比较好理解,可以将它比做为一列火车,每一节车厢都是一个对象,每一个对象都有不同处理逻辑(每一节车厢都有它唯一的座位号),如果我们的座位号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{
@Override
public void mateGame(String dan) {
if(dan.equals("bronze")){
//如果是青铜段位 匹配游戏
System.out.println("青铜匹配机制开始匹配游戏");
}else {
mMate.mateGame(dan);
}
}
}
白银:
/**
* 白银匹配机制
* */
public class SilverMate extends Mate{
@Override
public void mateGame(String dan) {
if(dan.equals("silver")){
//如果是白银段位 匹配游戏
System.out.println("白银匹配机制开始匹配游戏");
}else {
mMate.mateGame(dan);
}
}
}
黄金:
/**
* 黄金匹配机制
* */
public class GoldMate extends Mate{
@Override
public void mateGame(String dan) {
if(dan.equals("gold")){
//如果是黄金段位 匹配游戏
System.out.println("黄金匹配机制开始匹配游戏");
}else {
mMate.mateGame(dan);
}
}
}
铂金:
/**
* 铂金匹配机制
* */
public class PlatinumMate extends Mate{
@Override
public void mateGame(String dan) {
if(dan.equals("platinum")){
//如果是铂金段位 匹配游戏
System.out.println("铂金匹配机制开始匹配游戏");
}else {
mMate.mateGame(dan);
}
}
}
钻石:
/**
* 钻石匹配机制
* */
public class DiamondMate extends Mate{
@Override
public 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等条件判断语句,不过这样做可能也不会带来更好的收益。