责任链模式

2019-07-20  本文已影响0人  码上述Andy

1.概述

所谓责任链就是你能做就做,不能就推给别人做,是不是很好理解。例如以我们公司请假为例,5天以下总监可以批,5天以上就得总经理批,要是更长就得CEO老板批。

2.UML结构图

image.png image.png

3.代码实现:以我们公司请假为例

AbstractHandler:抽象处理角色

/**
 * Copyright (c) 2019.  All rights reserved.
 * Created by zhouwen on 2019/7/20.
 */

public abstract class AbstractHandler {

    private AbstractHandler mAbstractHandler;

    public void setNextIns(AbstractHandler abstractHandler) {
        mAbstractHandler = abstractHandler;
    }

    public AbstractHandler getNextIns() {
        return mAbstractHandler;
    }

    public abstract void onHandlerMessage(int days);
}

CEO:具体处理角色---老板

/**
 * Copyright (c) 2019.  All rights reserved.
 * Created by zhouwen on 2019/7/20.
 */

public class CEO extends AbstractHandler {
    @Override
    public void onHandlerMessage(int days) {
        if(days <= 60){
            Logger.getLogger("CEO").info("老板可以批准");
        } else {
            Logger.getLogger("CEO").info("可以滚蛋了");
        }
    }
}

Manager:具体处理角色---总经理

/**
 * Copyright (c) 2019.  All rights reserved.
 * Created by zhouwen on 2019/7/20.
 */

public class Manager extends AbstractHandler {
    @Override
    public void onHandlerMessage(int days) {
        if (days <= 10) {
            Logger.getLogger("Manager").info("总经理可以批准");
        } else {

            if (getNextIns() != null) {
                Logger.getLogger("Manager").info("总经理批准不了,需要上报老板");
                getNextIns().onHandlerMessage(days);
            } else {
                Logger.getLogger("Manager").info("总经理也请假了。。。。");
            }
        }
    }
}

Inspector:具体处理角色---总监

/**
 * Copyright (c) 2019.  All rights reserved.
 * Created by zhouwen on 2019/7/20.
 */

public class Inspector extends AbstractHandler {

    public void setNextIns(AbstractHandler abstractHandler) {
        super.setNextIns(abstractHandler);
    }
    @Override
    public void onHandlerMessage(int days) {
        if (days <= 5){
            Logger.getLogger("Inspector").info("总监可以批准");
        } else {
            if (getNextIns() != null) {
                getNextIns().onHandlerMessage(days);
                Logger.getLogger("Inspector").info("总监批准不了,需要上报总经理");
            } else {
                Logger.getLogger("Inspector").info("总监也请假了。。。。");
            }

        }
    }
}

Staff:客户角色---员工类

/**
 * Copyright (c) 2019.  All rights reserved.
 * Created by zhouwen on 2019/7/20.
 */

public class Staff {
    public void test(){
        AbstractHandler inspector = new Inspector();
        AbstractHandler manager = new Manager();
        AbstractHandler ceo = new CEO();

        inspector.setNextIns(manager);
        manager.setNextIns(ceo);
        inspector.onHandlerMessage(5);
    }
}

4.android中应用场景

Android的View事件传递机制就是基于责任链模式。
事件传递基于:Activity-->ViewGroup-->View的顺序。当前返回true则说明自己处理,false反之.

如图:当下面事件序列都方法false时

image.png

如图:当下面事件序列都方法true时

image.png
上一篇 下一篇

猜你喜欢

热点阅读