设计模式学习小结

设计模式小结-责任链模式

2017-12-28  本文已影响17人  r09er

责任链模式概述

现实中,向公司请假可能会走一系列的流程,其中请不同的天数也可能会由不同的人来审批,如果是3天以内的,你的直系上级领导应该就能批准,如果是3到7天,那么可能就要部门总经理批准,如果要请到30天,那么肯定就要更高的领导批准了,这个流程抽象出来,就形成了责任链模式.

责任链模式优缺点

优点

缺点

适用场景

UML图

示例

一个假条审批模块:如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。试用职责链模式设计该假条审批模块。

示例代码

请假实体类

public class LeaveRequest {
    //请假天数
    private int day;
    //请假人名字
    private String name;

    public LeaveRequest(int day, String name) {
        this.day = day;
        this.name = name;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

抽象处理人

public abstract class Approver {
    protected Approver nextApprover;
    protected String processName;//处理人名字

    public Approver(String processName) {
        this.processName = processName;
    }
    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }
    //处理请假的抽象方法
    public abstract void processRequest(LeaveRequest leaveRequest);

}

具体处理人

public class Director extends Approver {

    public Director(String processName) {
        super(processName);
    }

    @Override
    public void processRequest(LeaveRequest leaveRequest) {
        if (leaveRequest.getDay() < 3) {
            System.out.println(String.format("%s主任批准%s请%s天假", processName,leaveRequest.getName(),leaveRequest.getDay()));

        } else {
            //转发请求
            nextApprover.processRequest(leaveRequest);
        }
    }
}

public class Manager extends Approver {
    public Manager(String processName) {
        super(processName);
    }

    @Override
    public void processRequest(LeaveRequest leaveRequest) {
        if (leaveRequest.getDay()<10) {
            System.out.println(String.format("%s经理批准%s请%s天假",processName,leaveRequest.getName(),leaveRequest.getDay()));
        }else{
            this.nextApprover.processRequest(leaveRequest);
        }
    }
}

public class GeneralManager extends Approver {

    public GeneralManager(String processName) {
        super(processName);
    }

    @Override
    public void processRequest(LeaveRequest leaveRequest) {
        if (leaveRequest.getDay() < 30) {
            System.out.println(String.format("%s总经理批准%s请%s天假",processName, leaveRequest.getName(), leaveRequest.getDay()));
        } else {
            System.out.println("拒绝提交超过30天的请假申请");
        }
    }
}

调用

  public static void main(String[] args) {
        LeaveRequest leaveRequest1 = new LeaveRequest(2,"哈哈");
        LeaveRequest leaveRequest2 = new LeaveRequest(15,"呵呵");
        LeaveRequest leaveRequest3 = new LeaveRequest(40,"嘿嘿");

        Approver director = new Director("张三");
        Approver manager = new Manager("李四");
        Approver generalManager = new GeneralManager("王五");

        director.setNextApprover(manager);
        manager.setNextApprover(generalManager);
        director.processRequest(leaveRequest1);
        director.processRequest(leaveRequest2);
        director.processRequest(leaveRequest3);


    }
上一篇 下一篇

猜你喜欢

热点阅读