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


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

    一,定义

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

    责任链模式比较好理解,可以将它比做为一列火车,每一节车厢都是一个对象,每一个对象都有不同处理逻辑(每一节车厢都有它唯一的座位号),如果我们的座位号12车厢8A号座位,如果我们从一号车厢进去的,需要一节一节的走到12号车厢。

    二,使用场景

    1,多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定

    2,在请求处理者不明确的情况下,向多个对象中的一个提交一个请求

    3,需要动态指定一组对象处理请求

    三,具体使用

    责任链模式在安卓中最典型的应用就是view事件的传递机制,感兴趣的可以去看下源码是怎么实现的,这里就不再展开了。

    下面举一个比较好理解的例子。

    假设英雄联盟有五个段位,青铜,白银,黄金,铂金,钻石。每个段位匹配都有相应的匹配机制让你匹配到同段位的玩家。

    首先需要创建一个匹配机制的抽象类:

    1. /**
    2. * 匹配抽象类
    3. * */
    4. public abstract class Mate {
    5. protected Mate mMate;
    6. /**
    7. * 设置下一个段位
    8. * */
    9. public void setNextDan(Mate mate){
    10. this.mMate =mate;
    11. }
    12. /**
    13. * 匹配游戏
    14. * */
    15. public abstract void mateGame(String dan);
    16. }

    然后创建具体的匹配机制类:

    青铜:

    1. /**
    2. * 青铜匹配机制
    3. * */
    4. public class BronzeMate extends Mate{
    5. @Override
    6. public void mateGame(String dan) {
    7. if(dan.equals("bronze")){
    8. //如果是青铜段位 匹配游戏
    9. System.out.println("青铜匹配机制开始匹配游戏");
    10. }else {
    11. mMate.mateGame(dan);
    12. }
    13. }
    14. }

    白银:

    1. /**
    2. * 白银匹配机制
    3. * */
    4. public class SilverMate extends Mate{
    5. @Override
    6. public void mateGame(String dan) {
    7. if(dan.equals("silver")){
    8. //如果是白银段位 匹配游戏
    9. System.out.println("白银匹配机制开始匹配游戏");
    10. }else {
    11. mMate.mateGame(dan);
    12. }
    13. }
    14. }

    黄金:

    1. /**
    2. * 黄金匹配机制
    3. * */
    4. public class GoldMate extends Mate{
    5. @Override
    6. public void mateGame(String dan) {
    7. if(dan.equals("gold")){
    8. //如果是黄金段位 匹配游戏
    9. System.out.println("黄金匹配机制开始匹配游戏");
    10. }else {
    11. mMate.mateGame(dan);
    12. }
    13. }
    14. }

    铂金:

    1. /**
    2. * 铂金匹配机制
    3. * */
    4. public class PlatinumMate extends Mate{
    5. @Override
    6. public void mateGame(String dan) {
    7. if(dan.equals("platinum")){
    8. //如果是铂金段位 匹配游戏
    9. System.out.println("铂金匹配机制开始匹配游戏");
    10. }else {
    11. mMate.mateGame(dan);
    12. }
    13. }
    14. }

    钻石:

    1. /**
    2. * 钻石匹配机制
    3. * */
    4. public class DiamondMate extends Mate{
    5. @Override
    6. public void mateGame(String dan) {
    7. if(dan.equals("diamond")){
    8. //如果是钻石段位 匹配游戏
    9. System.out.println("钻石匹配机制开始匹配游戏");
    10. }else {
    11. mMate.mateGame(dan);
    12. }
    13. }
    14. }

    创建一个玩家类,包含玩家的段位:

    1. /**
    2. * 玩家
    3. * */
    4. public class Gamer {
    5. /**
    6. * 段位
    7. * */
    8. private String dan;
    9. public Gamer(String dan) {
    10. this.dan = dan;
    11. }
    12. public String getDan() {
    13. return dan;
    14. }
    15. }

    具体使用:

    1. BronzeMate bronzeMate =new BronzeMate();
    2. SilverMate silverMate =new SilverMate();
    3. GoldMate goldMate =new GoldMate();
    4. PlatinumMate platinumMate =new PlatinumMate();
    5. DiamondMate diamondMate =new DiamondMate();
    6. bronzeMate.setNextDan(silverMate);
    7. silverMate.setNextDan(goldMate);
    8. goldMate.setNextDan(platinumMate);
    9. platinumMate.setNextDan(diamondMate);
    10. Gamer gamer1 =new Gamer("gold");
    11. bronzeMate.mateGame(gamer1.getDan());
    12. Gamer gamer2 =new Gamer("diamond");
    13. bronzeMate.mateGame(gamer2.getDan());

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

    最后输出:

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

    四,总结

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

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

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

  • 相关阅读:
    基于YOLOv8的安全帽检测系统
    Day18:初识B、B+树&RB树
    S环形避障装置研究与设计(solidworks)
    Vue条件渲染与列表渲染
    相机卡格式化了还能恢复吗?答案在这!(附带恢复教程)
    网络营销利器:海外IP代理如何助力你的网络营销?如何选择?
    Maven3.6.2安装详细教程
    QML的使用
    什么是广电入库
    Java面试题--spring boot
  • 原文地址:https://blog.csdn.net/y2653904/article/details/134519019