问题引入
一个人请假,根据请假天数的不同,应该由不同的人处理
模式引入
public abstract class Handle {
Handle nextHandle;
String name;
public Handle(String name) {
this.name = name;
}
/**
* @Description: 设置下一个处理者,为了让子类形成链条
* @Param nextHandle:
* @return void
* @date 2022/7/31 10:44
*/
public void setNextHandle(Handle nextHandle) {
this.nextHandle = nextHandle;
}
/**
* @Description: 假期请求处理抽象方法,具体实现交给子类
* @Param vacationRequest:
* @return void
* @date 2022/7/31 10:46
*/
public abstract void processRequest(VacationRequest vacationRequest);
}
- 具体子类
public class GroupLeader extends Handle {
public GroupLeader(String name) {
super(name);
}
@Override
public void processRequest(VacationRequest vacationRequest) {
if (vacationRequest.getVacationDay() <= 3) {
System.out.println(vacationRequest.getId() + "被组长处理");
} else { // 将请求传递给下一个执行链
nextHandle.processRequest(vacationRequest);
}
}
}
- 具体子类
public class Manager extends Handle{
public Manager(String name) {
super(name);
}
@Override
public void processRequest(VacationRequest vacationRequest) {
if (vacationRequest.getVacationDay() > 3 && vacationRequest.getVacationDay() <= 30) {
System.out.println(vacationRequest.getId() + "被经理处理了");
} else {
nextHandle.processRequest(vacationRequest);
}
}
}
- 具体子类
public class Chairman extends Handle {
public Chairman(String name) {
super(name);
}
@Override
public void processRequest(VacationRequest vacationRequest) {
if (vacationRequest.getVacationDay() > 30) {
System.out.println(vacationRequest.getId() + "被董事长处理了");
} else {
nextHandle.processRequest(vacationRequest);
}
}
}
- 封装一个请求类
public class VacationRequest {
private int type = 0;
private int vacationDay; // 请假天数
private int id;
public VacationRequest(int type, int vacationDay, int id) {
this.type = type;
this.vacationDay = vacationDay;
this.id = id;
}
public int getType() {
return type;
}
public int getVacationDay() {
return vacationDay;
}
public int getId() {
return id;
}
}
调用测试
public class Client {
public static void main(String[] args) {
// 创建一个请求
VacationRequest vacationRequest = new VacationRequest(1, 130, 1111);
// 创建相关负责人
GroupLeader groupLeader = new GroupLeader("组长");
Manager manager = new Manager("经理");
Chairman chairman = new Chairman("懂事长");
// 设置链条,形成环路
groupLeader.setNextHandle(manager);
manager.setNextHandle(chairman);
chairman.setNextHandle(groupLeader);
groupLeader.processRequest(vacationRequest);
}
}