• 设计模式-责任链模式



    1.什么是责任链模式

    责任链模式(Chain of Responsibility Pattern) 又称职责链模式 为请求创建了一个接收者对象的链。对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

    责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

    自己的理解 类似审批流 一个请求被多个处理者处理 并且每个处理者都有自己处理的条件限制 整个流程构成一条审批流程

    2.为什么要用责任链模式

    如果 不使用责任链模式
    代码会出现大量if...else多分支的判断
    请求发送者 和 请求处理者 耦合度高

    3.怎么使用责任链模式
    例子1

    public class ChainOfResponsibilityPatternTest {
        public static void main(String[] args) {
            //组装责任链
            Handler handler1 = new ConcreteHandler1();
            Handler handler2 = new ConcreteHandler2();
            handler1.setNext(handler2);
            //提交请求
            handler1.handleRequest("one");
        }
    }
    
    /**
     * 抽象处理者
     */
    abstract class Handler {
        private Handler next;
    
        public void setNext(Handler next) {
            this.next = next;
        }
    
        public Handler getNext() {
            return next;
        }
    
        /**
         * 处理请求的方法
         */
        public abstract void handleRequest(String request);
    }
    
    /**
     * 具体处理者1
     */
    class ConcreteHandler1 extends Handler {
        @Override
        public void handleRequest(String request) {
            if ("one".equals(request)) {
                System.out.println("具体处理者1负责处理该请求!");
            } else {
                if (getNext() != null) {
                    getNext().handleRequest(request);
                } else {
                    System.out.println("没有人处理该请求!");
                }
            }
        }
    }
    
    /**
     * 具体处理者2
     */
    class ConcreteHandler2 extends Handler {
        @Override
        public void handleRequest(String request) {
            if (("two").equals(request)) {
                System.out.println("具体处理者2负责处理该请求!");
            } else {
                if (getNext() != null) {
                    getNext().handleRequest(request);
                } else {
                    System.out.println("没有人处理该请求!");
                }
            }
        }
    }
    View Code


    例子2

    public class ChainOfResponsibilityPatternTest2 {
        public static void main(String[] args) {
            //组装责任链
            Leader leader1 = new ClassAdviser();
            Leader leader2 = new DepartmentHead();
            Leader leader3 = new Dean();
            Leader leader4 = new DeanOfStudies();
            leader1.setNext(leader2);
            leader2.setNext(leader3);
            leader3.setNext(leader4);
            //提交请求
            leader1.handleRequest(20);
        }
    }
    
    //抽象处理者:领导类
    abstract class Leader {
        private Leader next;
    
        public void setNext(Leader next) {
            this.next = next;
        }
    
        public Leader getNext() {
            return next;
        }
    
        //处理请求的方法
        public abstract void handleRequest(int LeaveDays);
    }
    
    //具体处理者1:班主任类
    class ClassAdviser extends Leader {
        @Override
        public void handleRequest(int LeaveDays) {
            if (LeaveDays <= 2) {
                System.out.println("班主任批准您请假" + LeaveDays + "天。");
            } else {
                if (getNext() != null) {
                    getNext().handleRequest(LeaveDays);
                } else {
                    System.out.println("请假天数太多,没有人批准该假条!");
                }
            }
        }
    }
    
    //具体处理者2:系主任类
    class DepartmentHead extends Leader {
        @Override
        public void handleRequest(int LeaveDays) {
            if (LeaveDays <= 7) {
                System.out.println("系主任批准您请假" + LeaveDays + "天。");
            } else {
                if (getNext() != null) {
                    getNext().handleRequest(LeaveDays);
                } else {
                    System.out.println("请假天数太多,没有人批准该假条!");
                }
            }
        }
    }
    
    //具体处理者3:院长类
    class Dean extends Leader {
        @Override
        public void handleRequest(int LeaveDays) {
            if (LeaveDays <= 10) {
                System.out.println("院长批准您请假" + LeaveDays + "天。");
            } else {
                if (getNext() != null) {
                    getNext().handleRequest(LeaveDays);
                } else {
                    System.out.println("请假天数太多,没有人批准该假条!");
                }
            }
        }
    }
    
    //具体处理者4:教务处长类
    class DeanOfStudies extends Leader {
        @Override
        public void handleRequest(int LeaveDays) {
            if (LeaveDays <= 20) {
                System.out.println("教务处长批准您请假" + LeaveDays + "天。");
            } else {
                if (getNext() != null) {
                    getNext().handleRequest(LeaveDays);
                } else {
                    System.out.println("请假天数太多,没有人批准该假条!");
                }
            }
        }
    }
    View Code
    古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。
  • 相关阅读:
    Spring Security Oauth2 认证(获取token/刷新token)流程
    Centos7安装配置Apache(httpd)+php+mysql+phpMyAdmin
    servlet 请求(Request)
    关于对连接数据库时出现1130-host “**” is not allowed to connect to this MySql/mariadb server 的错误解决方法
    在Spring中配置Hibernate和单独配置Hibernate的区别
    新手学Struts2的几个小注意事项
    Oracle 11g 发行版2 新安装后关于登录的一些基本操作
    CentOS7下mariaDB和phpmyadmin的一些安装和配置问题
    Ubuntu的一些文件系统的操作(转自我自己的其他博客)
    jquery上传图片获取像素
  • 原文地址:https://www.cnblogs.com/wf-zhang/p/14951517.html
Copyright © 2020-2023  润新知