职责链模式

2020-06-25  本文已影响0人  nieniemin

什么是职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。借这个对象连成一条链,并沿着这条链传递该请求,直到有对象处理为止。

模式角色

UML类图

职责链模式

代码实现

一个请求有多个对象可以处理,但每个对象的处理条件或者具备的权限不同。比如公司员工请假,直属领导一般3天以内假期可以批准,3天以上需要总监签字。责任链模式就可以很好的解决这样的问题。

public abstract class Manager {

    // 后继连接
    private  Manager next;

    public Manager getNext() {
        return next;
    }

    public void setNext(Manager next) {
        this.next = next;
    }

    //定义一个抽象的处理请求的方法
    public abstract String handlerRequest(String employee, int leaveDays);
}
public class DepartmentManager extends Manager {
    @Override
    public String handlerRequest(String employee, int leaveDays) {

        if (leaveDays <= 3) {
            System.out.println(this.getClass().getSimpleName() + ",同意:" + employee + leaveDays + "天,假期");
        } else {
            // 部门经理处理不了,判断是否有下一个执行者存在
            if (null != getNext()) {
                getNext().handlerRequest(employee, leaveDays);
            } else {
                System.out.println("没有执行者可以处理" + employee + leaveDays + "天,假期申请");
            }

        }
        return null;
    }
}
public class Director extends Manager {

    @Override
    public String handlerRequest(String employee, int leaveDays) {

        if (leaveDays < 7 ) {
            System.out.println(this.getClass().getSimpleName() + ",同意:" + employee + leaveDays + "天,假期");
        } else {
            // 总监处理不了,判断是否有下一个执行者存在
            if (null != getNext()) {
                getNext().handlerRequest(employee, leaveDays);
            } else {
                System.out.println("没有执行者可以处理" + employee + leaveDays + "天,假期申请");
            }

        }
        return null;
    }
}
public class Client {

    public static void main(String[] args) {
        DepartmentManager departmentManager = new DepartmentManager();
        Director director = new Director();
        // 部门经理下一级是总监
        departmentManager.setNext(director);

        departmentManager.handlerRequest("员工张三", 5);

        System.out.println("******************************************");
        director.handlerRequest("员工张三", 10);
    }

}
Director,同意:员工张三5天,假期
******************************************
没有执行者可以处理员工张三10天,假期申请

优点

上一篇 下一篇

猜你喜欢

热点阅读