责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
    就是每一个类只负责自己的模块的功能。

    应用实例: 1、红楼梦中的”击鼓传花”。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

    请假请求类

    1. /**
    2. * @author meikb
    3. * @desc 请假请求类
    4. * @date 2020-05-23 16:59
    5. */
    6. public class LeaveRequest {
    7. public LeaveRequest(int day){
    8. this.day = day;
    9. }
    10. private int day;
    11. public int getDay() {
    12. return day;
    13. }
    14. public void setDay(int day) {
    15. this.day = day;
    16. }
    17. }

    抽象类

    1. /**
    2. * @author meikb
    3. * @desc 请假抽象类
    4. * @date 2020-05-23 16:21
    5. */
    6. public abstract class AbstractLeave {
    7. public int min = 1;
    8. public int middle = 3;
    9. public int max = 5;
    10. protected AbstractLeave nextHandler;
    11. public void handLeave(LeaveRequest request){
    12. }
    13. public AbstractLeave getNextHandler() {
    14. return nextHandler;
    15. }
    16. public void setNextHandler(AbstractLeave nextHandler) {
    17. this.nextHandler = nextHandler;
    18. }
    19. }

    一级审核人

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-23 16:57
    5. */
    6. public class FirstLeader extends AbstractLeave{
    7. @Override
    8. public void handLeave(LeaveRequest request) {
    9. if(request.getDay() <= min){
    10. System.out.println("审核完成");
    11. return;
    12. }
    13. System.out.println("一级领导审核通过");
    14. if(null != this.nextHandler){
    15. this.nextHandler.handLeave(request);
    16. }
    17. }
    18. @Override
    19. public void setNextHandler(AbstractLeave nextHandler) {
    20. super.setNextHandler(nextHandler);
    21. }
    22. }

    二级审核人

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-23 16:57
    5. */
    6. public class SecondLeader extends AbstractLeave{
    7. @Override
    8. public void handLeave(LeaveRequest request) {
    9. if(request.getDay() <= middle){
    10. System.out.println("二级审核完成");
    11. return;
    12. }
    13. System.out.println("二级审核通过");
    14. if(null != this.nextHandler){
    15. this.nextHandler.handLeave(request);
    16. }
    17. }
    18. @Override
    19. public void setNextHandler(AbstractLeave nextHandler) {
    20. super.setNextHandler(nextHandler);
    21. }
    22. }

    三级审核人

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-23 16:57
    5. */
    6. public class ThridLeader extends AbstractLeave{
    7. @Override
    8. public void handLeave(LeaveRequest request) {
    9. System.out.println("三级领导审核完成");
    10. if(null != this.nextHandler){
    11. this.nextHandler.handLeave(request);
    12. }
    13. }
    14. @Override
    15. public void setNextHandler(AbstractLeave nextHandler) {
    16. super.setNextHandler(nextHandler);
    17. }
    18. }

    主函数

    1. /**
    2. * @author meikb
    3. * @desc 主函数
    4. * @date 2020-05-23 17:06
    5. */
    6. public class ChainMain {
    7. public static void main(String[] args) {
    8. LeaveRequest request = new LeaveRequest(4);
    9. FirstLeader firstLeader = new FirstLeader();
    10. SecondLeader secondLeader = new SecondLeader();
    11. ThridLeader thridLeader = new ThridLeader();
    12. firstLeader.setNextHandler(secondLeader);
    13. secondLeader.setNextHandler(thridLeader);
    14. firstLeader.handLeave(request);
    15. }
    16. }