设计模式之责任链模式

一、概述

1、简介
  • 行为设计模式
  • 链式结构:将每一个节点看作一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止
2、定义
  • 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止
3、使用场景
  • 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定
  • 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
  • 需要动态指定一组对象处理请求
4、优缺点
  • 优点:

    • 对请求者和处理者关系解耦,提高代码灵活性
  • 缺点:

    • 对链中请求处理者的遍历,影响性能
5、UML类图

设计模式之责任链模式

  • (1)Handler:抽象处理者。声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用

    • ①定义handleRequest()方法,实现责任链的主要逻辑
    • ②声明下一级处理者对象
    • ③声明处理者对象的处理级别
    • ④声明具体的处理事件方法
  • (2)ConcreteHandler:具体处理者。对请求进行处理,如果不能处理则将请求转发给下一个节点上的处理对象

    • 行为1:被某个处理对象所处理
    • 行为2:将请求转送给下一个节点
6、注意点
  • 一个请求最终只有两种情况

    • 纯的责任链:被某个处理对象所处理
    • 不纯的责任链(常见):所有对象均未对其进行处理
  • 通常请求的参数也可进行抽象,然后再进行具体实现

二、实现

  • 场景:报账,不同的领导有不同的批准额度
1、抽象责任人
        public abstract class Leader {

            protected Leader nextHandler;// 下一级处理者

            /**
             * 处理报账请求
             * @param money 能批复的报账额度 
             */
            public final void handleRequest(int money){
                System.out.println(getLeader());
                if(money <=limit()){
                    handle(money);
                }else{
                    System.out.println("报账额度不足,提交领导");
                    if(null != nextHandler){
                        nextHandler.handleRequest(money);
                    }
                }
            }

            /**
             * 自身能批复的额度权限
             * @return 额度
             */
            public abstract int limit();

            /**
             * 处理报账行为
             * @param money 具体金额
             */
            public abstract void handle(int money);

            /**
             * 获取处理者
             * @return 处理者
             */
            public abstract String getLeader();
        }
2、具体责任人
  • 组长
        public class GroupLeader extends Leader{

            @Override
            public int limit() {
                return 1000;
            }
        
            @Override
            public void handle(int money) {
                System.out.println("组长批复报销"+ money +"元");
            }

            @Override
            public String getLeader() {
                return "当前是组长";
            }
        } 
  • 主管
        public class Director extends Leader{

            @Override
            public int limit() {
                return 5000;
            }

            @Override
            public void handle(int money) {
                System.out.println("主管批复报销"+ money +"元");
            }

            @Override
            public String getLeader() {
                return "当前是主管";
            }
        }
  • 经理
        public class Manager extends Leader{

            @Override
            public int limit() {
                return 10000;
            }

            @Override
            public void handle(int money) {
                System.out.println("经理批复报销"+ money +"元");
            }

            @Override
            public String getLeader() {
                return "当前是经理";
            }
        }
  • 老板
        public class Boss extends Leader{

            @Override
            public int limit() {
                return Integer.MAX_VALUE;
            }
        
            @Override
            public void handle(int money) {
                System.out.println("老板批复报销"+ money +"元");
            }

            @Override
            public String getLeader() {
                return "当前是老板";
            }
        }
3、Test(Client)
        public class Client {
            public static void main(String[] args) {
                // 构造各个领导对象
                GroupLeader groupLeader = new GroupLeader();
                Director director = new Director();
                Manager manager = new Manager();
                Boss boss = new Boss();
        
                // 设置上级领导处理者对象
                groupLeader.nextHandler = director;
                director.nextHandler = manager;
                manager.nextHandler = boss;

                //发起报账申请
                groupLeader.handleRequest(8000);
            }
        }