zoukankan      html  css  js  c++  java
  • 责任链模式

    1. 定义

    当你想让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式。

    2. 类图

    3. Example

    作为员工需要请假或者加薪,需要经历:技术leader——部门经历——CTO的流程。

    package com.gitlearning.hanldegit.patterns.cor;
    
    import lombok.Setter;
    
    @Setter
    public abstract class Handler {
        String name;
        Handler nextHandler;
    
        abstract void handleRequest(int leaveDays);
    
        public Handler(String name) {
            this.name = name;
        }
    }
    
    class HandlerA extends Handler {
        public HandlerA(String name) {
            super(name);
        }
    
        @Override
        void handleRequest(int leaveDays) {
            if (leaveDays <= 3) {
                System.err.println(String.format("%s批准了你的请假天数: %s天", name, leaveDays));
            } else {
                nextHandler.handleRequest(leaveDays);
            }
        }
    }
    
    class HandlerB extends Handler {
    
        public HandlerB(String name) {
            super(name);
        }
    
        @Override
        void handleRequest(int leaveDays) {
            if (leaveDays <= 7) {
                System.err.println(String.format("%s批准了你的请假天数: %s天", name, leaveDays));
            } else {
                nextHandler.handleRequest(leaveDays);
            }
        }
    }
    
    class HandlerC extends Handler {
    
        public HandlerC(String name) {
            super(name);
        }
    
        @Override
        void handleRequest(int leaveDays) {
    
            System.err.println(String.format("%s批准了你的请假天数: %s天", name, leaveDays));
        }
    }
    
    class Test {
        public static void main(String[] args) {
            HandlerA handlerA = new HandlerA("技术leader");
            HandlerB handlerB = new HandlerB("部门经理");
            HandlerC handlerC = new HandlerC("CTO");
            handlerA.setNextHandler(handlerB);
            handlerB.setNextHandler(handlerC);
    
            handlerA.handleRequest(1);
            handlerA.handleRequest(5);
            handlerA.handleRequest(8);
    
        }
    }
    
    

    输出结果:

    技术leader批准了你的请假天数: 1天
    部门经理批准了你的请假天数: 5天
    CTO批准了你的请假天数: 8天
    

    由此可见,请求被处理的时候,你不知道是谁在进行处理。请求有可能会被处理,也有可能不会被处理。

    4. 使用

    1. Spring拦截器链、servlet过滤器链等都采用了责任链设计模式。

    5.其他

    责任链的优点:

    1. 将请求的发送者和接受者解耦

    2. 可以简化你的对象,因为它不需要知道链的结构

    3. 通过改变链内的成员或调动它们的次序,允许动态新增或者删除Handler

    缺点:

    1. 可能不易观察运行时的特征
    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    凭这份pdf让我轻松拿下了蚂蚁金服、字节跳动、小米等大厂的offer
    阿里面试官看了我写的多线程博文,反问你也看过那本的(多线程)
    Docker简介及基本使用
    springboot常见问题之Rustful风格下,@PutMapping、@@DeleteMapping失效问题
    SpringBoot之国际化功能
    SpringBoot之Thymeleaf模板引擎
    SpringBoot之静态资源处理
    SpringBoot 配置原理
    SpringBoot: 配置文件用法
    SpringBoot版hello world
  • 原文地址:https://www.cnblogs.com/studentytj/p/12369469.html
Copyright © 2011-2022 走看看