Android设计模式

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

2018-06-06  本文已影响50人  今阳说

1. 定义

将一个请求从链式的首端发出,沿着链的路径依次传递给每个节点对象,直到有对象处理这个请求为止,使多个对象都有机会处理请求,从而避免了请求发送者与接收者之间的耦合关系,使编程更有灵活性。

2. 使用场景

  1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定
  2. 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
  3. 可动态指定一组对象处理请求。

3. 优缺点

4. Android源码中的使用

android中的触摸事件的传递机制,就属于责任链模式,从activity到phoneWindow,再到我们自己的rootView及子view层层传递,知道有view消费该事件

5. 实例演示

以公司中申请报销费用为例,不同领导可以批放不同额度的报销,职员提交申请后,申请由下往上传递,直到有领导处理该申请

  1. 创建一个领导基类
abstract class Leader {
        protected Leader nextLeader;//上一级领导处理者

        /**
         * 处理报账请求
         *
         * @param money 能批复的报账额度
         */
        public final void handleRequest(int money) {
            if (money <= limit()) {
                handle(money);
            } else {
                if (nextLeader != null) {
                    nextLeader.handleRequest(money);
                }
            }
        }

        /**
         * 自身能批复的额度权限
         *
         * @return 额度
         */
        public abstract int limit();

        /**
         * 处理报账行为
         *
         * @param money 具体金额
         */
        public abstract void handle(int money);
    }
  1. 创建不同层级的领导实现类,依次为组长,主管,经理,老板
    //组长
    class GroupLeader extends Leader {

        @Override
        public int limit() {
            return 1000;
        }

        @Override
        public void handle(int money) {
            LjyLogUtil.i("组长批准报销" + money + "元");
        }
    }

    //主管
    class Director extends Leader {

        @Override
        public int limit() {
            return 5000;
        }

        @Override
        public void handle(int money) {
            LjyLogUtil.i("主管批准报销" + money + "元");
        }
    }

    //经理
    class Manager extends Leader {

        @Override
        public int limit() {
            return 10000;
        }

        @Override
        public void handle(int money) {
            LjyLogUtil.i("经理批准报销" + money + "元");
        }
    }

    //老板
    class Boss extends Leader {

        @Override
        public int limit() {
            return Integer.MAX_VALUE;
        }

        @Override
        public void handle(int money) {
            LjyLogUtil.i("老板批准报销" + money + "元");
        }
    }
  1. 创建不同的领导对象,关联责任链,进行报销申请
 private void methodDutyChainPattern() {
        //申请报销费用为例
        //1.构建领导对象
        GroupLeader groupLeader = new GroupLeader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();
        //2.设置上一级领导
        groupLeader.nextLeader = director;
        director.nextLeader = manager;
        manager.nextLeader = boss;
        //3.发起报账申请,从最低级开始
        LjyLogUtil.i("---------审批范围-----------\n组长<=1000,主管<=5000,经理<=10000,老板>10000\n----------------");
        int num1 = 800;
        LjyLogUtil.i("-----------小智申请报销" + num1 + "元-----------");
        groupLeader.handleRequest(num1);
        int num2 = 6800;
        LjyLogUtil.i("-----------小米申请报销" + num2 + "元-----------");
        groupLeader.handleRequest(num2);
        int num3 = 18000;
        LjyLogUtil.i("-----------小明申请报销" + num3 + "元-----------");
        groupLeader.handleRequest(num3);
    }
上一篇 下一篇

猜你喜欢

热点阅读