安卓系列之设计模式:责任链模式

153 阅读2分钟

定义

一个请求需要多个对象当中的一个或者多个协作处理,属于行为型模式。

应用场景

需要经过多道工序处理

优点

1.发送者和接受者解耦
2.符合开闭规则和单一责任规则
3.简化对象

缺点

1.不能保证请求一定能有结果
2.性能会受影响

常见实例

1.安卓的事件分发机制

具体代码实现

例子说明:请假流程,组长--->总监--->经理--->老板

抽象类

领导

package com.elaine.testpattern.chain;

/**
 * 领导
 * author: elaine
 * date: 2021/4/29
 */
public abstract class Leader {
    //可以批的假期天数
    int approveDay;
    //更高级别的领导
    Leader nextLeader;

    /**
     * 设置可以批的假期天数
     *
     * @param day 天数
     */
    public abstract void setApproveDay(int day);

    /**
     * 处理员工的假期
     *
     * @param staff 员工
     */
    public abstract void handle(Staff staff);

    /**
     * 设置更高级别的老板
     *
     * @param nextLeader 更高级别的领导
     */
    public abstract void setNextLeader(Leader nextLeader);

    /**
     * 链式处理假期天数
     *
     * @param staff 员工
     */
    public void handleHoliday(Staff staff) {
        //如果当前的申请天数<=当前领导能批的天数,则直接该领导处理,否则交给更高级别的老板
        if (staff.holiday <= approveDay) {
            handle(staff);
        } else {
            nextLeader.handleHoliday(staff);
        }
    }
}

员工

package com.elaine.testpattern.chain;

import android.util.Log;

/**
 * 员工
 * author: elaine
 * date: 2021/4/29
 */
public abstract class Staff {
    //想要申请的假期天数
    int holiday;

    /**
     * 设置想要申请的假期天数
     *
     * @param holiday 天数
     */
    public abstract void setHoliday(int holiday);

    /**
     * 提交申请审批时的打印
     */
    public void submitHoliday() {
        Log.e("我是员工""我想要申请" + holiday + "天");
    }
}

实体

组长

package com.elaine.testpattern.chain;

import android.util.Log;

/**
 * 组长
 * author: elaine
 * date: 2021/4/29
 */
public class GroupLeader extends Leader {
    @Override
    public void setApproveDay(int day) {
        super.approveDay = day;
    }

    @Override
    public void handle(Staff staff) {
        staff.submitHoliday();
        Log.e("我是组长""我同意你休" + staff.holiday + "天假期");
    }

    @Override
    public void setNextLeader(Leader nextLeader) {
        super.nextLeader = nextLeader;
    }
}

总监

package com.elaine.testpattern.chain;

import android.util.Log;

/**
 * 总监
 * author: elaine
 * date: 2021/4/29
 */
public class DirectorLeader extends Leader {
    @Override
    public void setApproveDay(int day) {
        super.approveDay = day;
    }

    @Override
    public void handle(Staff staff) {
        staff.submitHoliday();
        Log.e("我是总监""我同意你休" + staff.holiday + "天假期");
    }

    @Override
    public void setNextLeader(Leader nextLeader) {
        super.nextLeader = nextLeader;
    }
}

经理

package com.elaine.testpattern.chain;

import android.util.Log;

/**
 * 经理
 * author: elaine
 * date: 2021/4/29
 */
public class ManagerLeader extends Leader {
    @Override
    public void setApproveDay(int day) {
        super.approveDay = day;
    }

    @Override
    public void handle(Staff staff) {
        staff.submitHoliday();
        Log.e("我是经理""我同意你休" + staff.holiday + "天假期");
    }

    @Override
    public void setNextLeader(Leader nextLeader) {
        super.nextLeader = nextLeader;
    }
}

老板

package com.elaine.testpattern.chain;

import android.util.Log;

/**
 * 老板
 * author: elaine
 * date: 2021/4/29
 */
public class BossLeader extends Leader {
    @Override
    public void setApproveDay(int day) {
        super.approveDay = day;
    }

    @Override
    public void handle(Staff staff) {
        staff.submitHoliday();
        Log.e("我是老板""我同意你休" + staff.holiday + "天假期");
    }

    @Override
    public void setNextLeader(Leader nextLeader) {
        super.nextLeader = nextLeader;
    }
}

底层员工

package com.elaine.testpattern.chain;

/**
 * 底层员工
 * author: elaine
 * date: 2021/4/29
 */
public class EntryLevelStaff extends Staff {
    @Override
    public void setHoliday(int holiday) {
        super.holiday = holiday;
    }
}

运行代码

    private void use() {
        EntryLevelStaff entryLevelStaff = new EntryLevelStaff();
        entryLevelStaff.setHoliday(4);

        Leader leader = getLeader();
        leader.handleHoliday(entryLevelStaff);
    }

    /**
     * 获取到最低的领导
     *
     * @return 组长
     */
    private Leader getLeader() {
        GroupLeader groupLeader = new GroupLeader();
        groupLeader.setApproveDay(1);

        DirectorLeader directorLeader = new DirectorLeader();
        directorLeader.setApproveDay(3);

        ManagerLeader managerLeader = new ManagerLeader();
        managerLeader.setApproveDay(5);

        BossLeader bossLeader = new BossLeader();
        bossLeader.setApproveDay(7);

        //设置每个领导上面更高的领导
        groupLeader.setNextLeader(directorLeader);
        directorLeader.setNextLeader(managerLeader);
        managerLeader.setNextLeader(bossLeader);

        return groupLeader;
    }

运行结果

图片

若帅哥美女对该系列文章感兴趣,可微信搜索公众号(木子闲集)关注更多更新文章哦,谢谢~