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. 可能不易观察运行时的特征
    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    precmd:6: job table full or recursion limit exceeded
    Logs
    vue路由的使用(二)
    vue路由的使用(一)
    vue项目中正确引用jquery
    vue中使用Mint-UI移动端组件库
    HTML5表单、一些新增的输入类型以及为不支持新特性的浏览器提供解决方案
    CSS3过渡、变形、动画(二)
    CSS3过渡、变形、动画(一)
    CSS3之背景渐变
  • 原文地址:https://www.cnblogs.com/studentytj/p/12369469.html
Copyright © 2011-2022 走看看