设计模式之职责链模式

职责链模式

职责链( Chain of Responsibility )模式也被叫做责任链模式,在《设计模式》属于行为型模式,是一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止。责任链模式将请求和处理分离开来,进行解耦。

责任链模式涉及角色

1、抽象处理者( Handler )角色:定义一个处理请求的抽象类。如果需要,可以定义一个方法以设定和返回对下家的引用。

2、具体处理者( ConcreteHandler ) 角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

应用场景

很常见的一个场景:请假。假定请假3天以内,由项目经理直接审批;3-5天,由部门经理审批通过;大于5天,则由总经理通过。

如果把上面的场景应用到责任链模式中去,项目经理、部门经理、总经理就是一个个具体的责任人,他们可以对请求做出处理,但是他们也只能在自己的权限范围内处理该请求。

抽象处理者

/**
 * 抽象处理者
 */
public static abstract class Handler {
    private Handler nextHandler;
    // 当前领导能审批通过的最多天数
    public int maxDay;
    protected Handler(int maxDay) {
        this.maxDay = maxDay;
    }
    //设置责任链中下一个处理请求的对象
    public void setNextHandler(Handler handler) {
        nextHandler = handler;
    }
    protected void handleRequest(int day) {
        if (day <= maxDay) {
            reply(day);
        } else {
            if (nextHandler != null) {
                //审批权限不够,继续上报
                nextHandler.handleRequest(day);
            } else {
                LogUtil.d("没有更高的领导审批了");
            }
        }
    }
    protected abstract void reply(int day);
}

具体处理者

项目经理

/**
 * 项目经理
 */
class ProjectManager extends Handler {
    public ProjectManager(int day) {
        super(day);
    }
    @Override
    protected void reply(int day) {
        LogUtil.d(day + "天请假,项目经理直接审批通过");
    }
}

部门经理

/**
 * 部门经理
 */
class DepartmentManager extends Handler {
    public DepartmentManager(int day) {
        super(day);
    }
    @Override
    protected void reply(int day) {
        LogUtil.d(day + "天请假,部门经理审批通过");
    }
}

总经理

/**
 * 总经理
 */
class GeneralManager extends Handler {
    public GeneralManager(int day) {
        super(day);
    }
    @Override
    protected void reply(int day) {
        LogUtil.d(day + "天请假,总经理审批通过");
    }
}

代码调用

Handler projectManager = new ProjectManager(3);
Handler departmentManager = new DepartmentManager(5);
Handler generalManager = new GeneralManager(15);
//创建职责链
projectManager.setNextHandler(departmentManager);
departmentManager.setNextHandler(generalManager);
//发起一次请求
projectManager.handleRequest(10);

打印

04-18 15:18:08.726 19678-19678/com.wuxiaolong.androidsamples D/wxl: 10天请假,总经理审批通过

Android 应用

1、Ordered Broadcast (有序广播)
Ordered Broadcast 的接收者将按预先声明的优先级依次接收 Broadcast 。如:A 的级别高于 B , B 的级别高于 C 。那么,Broadcast 先传给 A ,再传给 B ,最后传给 C 。优先级声明在 元素的 Android:priority 属性中,数越大优先级别越高,取值范围为 -1000~1000 。

2、ViewGroup 事件传递
事件传递也类似于一条责任链,分别有 dispatchTouchEvent (分发)、 onInterceptTouchEvent (拦截)、 onTouchEvent (处理),寻找责任者,一旦责任者消费掉该次事件,就并不再传递,体现在 View 的 onTouchEvent 方法中返回值。

参考

《JAVA与模式》之责任链模式

Android设计模式源码解析之责任链模式

JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】

    原文作者:算法小白
    原文地址: https://juejin.im/entry/58f818d4a22b9d006581b05d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞