设计模式之责任链模式

发布于:2024-09-05 ⋅ 阅读:(37) ⋅ 点赞:(0)

1.责任链概念

        允许请求沿着处理者链传递,直到链上的某个处理者决定处理此请求。通过这种方式,请求的发送者无须知道是哪一个接收者处理其请求,这使得系统可以动态地重新组织和分配责任。

2.责任链组成

        抽象处理者(Handler): 定义一个处理请求的接口,并持有下一个处理者的引用。

        具体处理者(Concrete Handlers): 实现抽象处理者的接口,在处理请求前判断自己是否能够处理该请求,如果可以则进行处理,否则将请求传递给下一个处理者。

        客户端(Client): 创建处理者链并将请求发送到链的第一个节点。

3.举个栗子:

以学生请假为例

7天        正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行)    结果==》导员批

7天        非正常流程(导员有事): 老师(小于2天)===>校长(所有都行)              结果==》校长批

15天       正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行)   结果==》校长批

4.代码实现

1)抽象处理者

package org.xiji.ChainOfResponsibility;

/**
 * 抽象处理者
 */
public abstract class Handler {
    /**
     * 下一个处理者
     */
    protected Handler nextHandler;

    public Handler setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
        return this.nextHandler;
    }

    /**
     * 定义处理方法
     */
    public abstract void handle(int day);



}

2)具体处理者

老师

package org.xiji.ChainOfResponsibility;

/**
 * 老师
 */
public class Teacher extends Handler{
    @Override
    public void handle(int day) {
        if (day <= 2) {
            System.out.println("老师批注请假"+day+"天");
        }else {
            nextHandler.handle(day);
        }

    }
}

导员

package org.xiji.ChainOfResponsibility;

/**
 * 导员
 */
public class Instructor extends Handler{
    @Override
    public void handle(int day) {
        if (day <= 7) {
            System.out.println("导员批注请假"+day+"天");
        } else {
            nextHandler.handle(day);
        }
    }
}

校长

package org.xiji.ChainOfResponsibility;

/**
 * 校长
 */
public class Principal extends Handler{
    @Override
    public void handle(int day) {
        System.out.println("校长批注请假"+day+"天");
    }
}

3)客户端类

package org.xiji.ChainOfResponsibility;

/**
 * 处理器测试类
 */
public class ChainOfResponsibilityMain {
    public static void main(String[] args) {
        //老师角色
        Teacher teacher = new Teacher();

        //导员角色
        Instructor instructor = new Instructor();

        //校长角色
        Principal principal = new Principal();

        System.out.println("===========================");
        /**
         * 请假关系   老师==>导员===>校长
         */
        System.out.println("正常流程请7天假");
        teacher.setNextHandler(instructor);
        instructor.setNextHandler(principal);
        //例如找老师请假七天
        int day = 7;
        teacher.handle(day);

        System.out.println("===========================");
        System.out.println("非正常流程请7天假");
        //找老师请假七天,导员不在,老师让你找校长
        /**
         * 请假关系 老师===>校长
         */
        teacher.setNextHandler(principal);
        teacher.handle(day);
        System.out.println("===========================");
        System.out.println("正常流程请15天假");
        //想请15天假
        int day2 = 15;
        //正常流程 找老师请假===>导员===>校长
        teacher.setNextHandler(instructor);
        instructor.setNextHandler(principal);
        teacher.handle(day2);

    }
}

5.运行结果