定义
一个请求需要多个对象当中的一个或者多个协作处理,属于行为型模式。
应用场景
需要经过多道工序处理
优点
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;
}