0
点赞
收藏
分享

微信扫一扫

外包干了14天,技术退步明显。。。

墨香子儿 2024-03-20 阅读 16

设计模式(行为型设计模式——职责链模式)

职责链模式

基本定义

模式结构

代码实现

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=‘去旅行’}

优点

缺点

使用场景

总结

举报

相关推荐

0 条评论