Android设计模式--责任链模式

无善无恶心之体,有善有恶意之动。知善知恶是良知,为善去恶是格物。

一,定义

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

责任链模式比较好理解,可以将它比做为一列火车,每一节车厢都是一个对象,每一个对象都有不同处理逻辑(每一节车厢都有它唯一的座位号),如果我们的座位号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());

这里有一个黄金和一位钻石玩家开始了匹配,他们不知道内部的匹配机制,他们只需要都使用青铜机制开始匹配就可以,最后都会匹配到和他们段位相同的选手。

最后输出:

Android设计模式--责任链模式_第1张图片

至此,就实现了一个简单的责任链模式。

四,总结

优点:可以对请求者和处理者关系解耦,提高代码的灵活性

缺点:对链中请求处理者的遍历,如果处理者太多,必定会影响性能。

总的来说我们完全可以用责任链模式来代替switch case 或者if else等条件判断语句,不过这样做可能也不会带来更好的收益。

你可能感兴趣的:(android设计模式,设计模式,责任链模式)