设计模式(行为型设计模式——职责链模式)
职责链模式
基本定义
模式结构
代码实现
Handler:抽象处理者
public abstract class Leader {
private String position;//岗位
Leader nextLeader;//下一节点审核人员
public Leader(String position) {
super();
this.position = position;
}
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
//处理请求
public abstract void process(LeaveRequest leaveRequest);
}
ConcreteHandler:具体处理者
组长 批准1天及以下假期, 职责链上的一个具体处理者
@Slf4j
public class GroupLeader extends Leader {
public GroupLeader(String position) {
super(position);
}
@Override
public void process(LeaveRequest leaveRequest) {
if(leaveRequest.getDays() <= 1){
log.info("组长批准: 同意。【请假单:姓名{}, 请假天数: {} , 原因:{} 】",
leaveRequest.getName(),
leaveRequest.getDays() ,
leaveRequest.getReason());
}else {
if(nextLeader == null){
log.info("该请假单不能被批准:{} ", leaveRequest);
}
nextLeader.process(leaveRequest);
}
}
}
经理-批准3天及以下, 职责链上的一个具体处理者
@Slf4j
public class ManageLeader extends Leader{
public ManageLeader(String position) {
super(position);
}
@Override
public void process(LeaveRequest leaveRequest) {
if(leaveRequest.getDays() <= 3){
log.info("经理批准: 同意。【请假单:姓名{}, 请假天数: {} , 原因:{} 】",
leaveRequest.getName(),
leaveRequest.getDays() ,
leaveRequest.getReason());
}else{
if(nextLeader == null){
log.info("该请假单不能被批准:{} ", leaveRequest);
return;
}
nextLeader.process(leaveRequest);
}
}
}
CEO-批准5天及以下,职责链上的一个具体处理者
@Slf4j
public class CEOLeader extends Leader{
public CEOLeader(String position) {
super(position);
}
@Override
public void process(LeaveRequest leaveRequest) {
if(leaveRequest.getDays() <= 5){
log.info("CEO批准: 同意。【请假单:姓名{}, 请假天数: {} , 原因:{} 】",
leaveRequest.getName(),
leaveRequest.getDays() ,
leaveRequest.getReason());
}else{
if(nextLeader == null){
log.info("该请假单不能被批准:{} ", leaveRequest);
return;
}
nextLeader.process(leaveRequest);
}
}
}
POJO: 普通Java类
@Getter
@Setter
public class LeaveRequest {
private String name;
private int days;
private String reason;
public LeaveRequest() {
}
public LeaveRequest(String name, int days, String reason) {
this.name = name;
this.days = days;
this.reason = reason;
}
@Override
public String toString() {
return "LeaveRequest{" +
"name='" + name + '\'' +
", days=" + days +
", reason='" + reason + '\'' +
'}';
}
}
Client:测试类
public class Test {
public static void main(String[] args){
Leader groupLeader = new GroupLeader("组长");
Leader manageLeader = new ManageLeader("经理");
groupLeader.setNextLeader(manageLeader);
Leader ceo = new CEOLeader("总经理");
manageLeader.setNextLeader(ceo);
LeaveRequest oneDay = new LeaveRequest("林冲", 1, "爬山");
LeaveRequest threeDays = new LeaveRequest("吴用", 3, "回家相亲");
LeaveRequest fiveDays = new LeaveRequest("武松", 5, "去打猎");
LeaveRequest sixDays = new LeaveRequest("李逵", 7, "去旅行");
groupLeader.process(oneDay);
groupLeader.process(threeDays);
groupLeader.process(fiveDays);
groupLeader.process(sixDays);
}
}
输出结果
组长批准: 同意。【请假单:姓名林冲, 请假天数: 1 , 原因:爬山 】
经理批准: 同意。【请假单:姓名吴用, 请假天数: 3 , 原因:回家相亲 】
CEO批准: 同意。【请假单:姓名武松, 请假天数: 5 , 原因:去打猎 】
该请假单不能被批准:LeaveRequest{name=‘李逵’, days=7, reason=‘去旅行’}