美文网首页
设计模式之责任链模式

设计模式之责任链模式

作者: Kevin_小飞象 | 来源:发表于2019-04-04 10:32 被阅读0次

    定义

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

    Android 中源码使用责任链模式

    • View事件的分发处理
      ViewGroup 事件投递的递归调用就类似于一条责任链,一旦其寻找到责任者,那么将由责任者持有并消费掉该次事件,具体体现在 View 的 onTouchEvent 方法中返回值的设置,如果返回false,那么意味着当前的 View 不会是该次的责任人,将不会对其持有;如果返回 true,此时View 会持有该事件并不再向外传递。

    特点

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

    • 缺点
      每次都需要对链中请求处理者遍历,如果处理者太多那么遍历必定会影响性能,特别是在一些递归调用者中,要慎用。

    使用场景

    1.多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
    2.在请求处理者不明确的情况下向多个对象中的一个提交请求。
    3.需要动态指定一组对象处理请求。

    简单实现

    公司的报账审批流程,类似我们今天说的责任链模式。

    public abstract class Leader {
    
        public Leader preHandler;  //上级领导
    
        public final void handleRequest(int money) {
            Log.d("TAG", getLeader());
    
            if (money <= limit()) {
                handle(money);
            }else {
                Log.d("TAG", "超出我的报账额度,提交上级领导 ");
    
                if (preHandler != null) {
                    preHandler.handleRequest(money);
                }
            }
        }
    
        public abstract int limit();   //额度
    
        public abstract void handle(int money); //具体金额
    
        public abstract String getLeader();  //处理者
    }
    
    -----------------------------------------
    public class GroupLeader extends Leader {
        @Override
        public int limit() {
            return 1000;
        }
    
        @Override
        public void handle(int money) {
            Log.d("TAG", "组长批复报销额度为:" + money + "元");
        }
    
        @Override
        public String getLeader() {
            return "组长";
        }
    }
    
    -----------------------------------------
    public class Director extends Leader {
        @Override
        public int limit() {
            return 5000;
        }
    
        @Override
        public void handle(int money) {
            Log.d("TAG", "主管批复报销额度为:" + money + "元");
        }
    
        @Override
        public String getLeader() {
            return "主管";
        }
    }
    
    -----------------------------------------
    public class Manager extends Leader {
        @Override
        public int limit() {
            return 10000;
        }
    
        @Override
        public void handle(int money) {
            Log.d("TAG", "经理批复报销额度为:" + money + "元");
        }
    
        @Override
        public String getLeader() {
            return "经理";
        }
    }
    
    -----------------------------------------
    public class Boss extends Leader {
        @Override
        public int limit() {
            return Integer.MAX_VALUE;
        }
    
        @Override
        public void handle(int money) {
            Log.d("TAG", "老板批复报销额度为:" + money + "元");
        }
    
        @Override
        public String getLeader() {
            return "老板";
        }
    }
    

    使用:

    public class MainActivity extends AppCompatActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
    
           initData();
       }
    
       private void initData() {
           GroupLeader groupLeader = new GroupLeader();
    
           Director director = new Director();
    
           Manager manager = new Manager();
    
           Boss boss = new Boss();
    
           groupLeader.preHandler = director;
           director.preHandler = manager;
           manager.preHandler = boss;
           //组长发起报账申请
           groupLeader.handleRequest(8000);
       }
    }
    

    输出结果:

    2019-04-04 10:25:47 D/TAG: 组长
    2019-04-04 10:25:47 D/TAG: 超出我的报账额度,提交上级领导 
    2019-04-04 10:25:47 D/TAG: 主管
    2019-04-04 10:25:47 D/TAG: 超出我的报账额度,提交上级领导 
    2019-04-04 10:25:47 D/TAG: 经理
    2019-04-04 10:25:47 D/TAG: 经理批复报销额度为:8000元
    

    相关文章

      网友评论

          本文标题:设计模式之责任链模式

          本文链接:https://www.haomeiwen.com/subject/vgzxiqtx.html