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

    责任链模式简述(Chain of Responsibility)

    定义

    使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将整个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理他为止。

    特点

    • 链上的每个对象都有机会处理请求
    • 链上的每一个对象,都持有下一个要处理对象的引用
    • 链上的某个对象无法处理当前请求,那么他会把相同的请求传递给下一个对象

    用一张图表示以下使用了责任链模式之后的架构:

    graph LR 请求发送者-->请求处理器1 请求处理器1-->请求处理器2 请求处理器2-->请求处理者

    也就是说责任链模式满足了请求发送者和请求处理者之间的松耦合,抽象非核心的部分,以链式调用的方式对请求对象进行处理。

    使用场景

    为完成同一请求,如果存在多个处理器以及不知道请求处理器的个数,或者请求处理器可动态配置的情况下,可以考虑使用责任链模式。

    对应的代码实现

    1. 定义业务执行接口
    public interface Handler {
        void entry(String req,String resp);
        //责任链逻辑
        void fireEntry(String req,String resp);
    
    }
    
    1. 定义链表元素,其中包含责任链执行逻辑
    /**
     * @author caoqianqian
     * @Description:链表元素,包含责任链的执行逻辑
     */
    public abstract  class AbstractLinkedProcessHandler implements Handler {
    
        private AbstractLinkedProcessHandler next = null;//默认指向null
    
        public AbstractLinkedProcessHandler getNext() {
            return next;
        }
    
        public void setNext(AbstractLinkedProcessHandler next){
            this.next = next;
        }
    
        //责任链的执行逻辑
        public void fireEntry(String req, String resp) {
            if(next != null){//判断是否到达end
                next.entry(req, resp);
            }
    
        }
    }
    
    1. 定义几个链表元素的实现

    先刷牙

    public class BrushTeeth extends AbstractLinkedProcessHandler {
    
        @Override
        public void entry(String req, String resp) {
    
            System.out.println("刷牙");
            fireEntry(req, resp);
        }
    }
    

    再洗脸

    public class WashFace extends AbstractLinkedProcessHandler {
    
        @Override
        public void entry(String req, String resp) {
    
            System.out.println("洗脸");
            fireEntry(req, resp);
        }
    }
    

    再是睡觉

    public class Sleep extends AbstractLinkedProcessHandler {
    
        @Override
        public void entry(String req, String resp) {
    
            System.out.println("睡觉");
            fireEntry(req, resp);
        }
    }
    
    1. 定义链表插入方法,以抽象类实现,同时继承链表元素的抽象类,目的是在未来的实现中,定义责任链功能调用逻辑
    /**
     * @author caoqianqian
     * @Description:定义链表结构的头部插入和尾部插入
     */
    public abstract class ProcessHandlerChain extends AbstractLinkedProcessHandler{
        public abstract void addFirst(AbstractLinkedProcessHandler processHandler);
        public abstract void addEnd(AbstractLinkedProcessHandler processHandler);
    
    }
    
    1. 定义链表的生成逻辑、责任链调用逻辑入口
    /**
     * @author caoqianqian
     * @Description:定义链表的生成逻辑  责任链调用逻辑入口
     */
    public class DefaultProcessHandlerChain extends ProcessHandlerChain {
    
       private AbstractLinkedProcessHandler first = new AbstractLinkedProcessHandler() {
            @Override
            public void entry(String req, String resp) {
                super.fireEntry(req, resp);
            }
        };
    
        private AbstractLinkedProcessHandler end = first;
    
        @Override
        public void addFirst(AbstractLinkedProcessHandler processHandler) {
    
            processHandler.setNext(first.getNext());
            first.setNext(processHandler);
    
            if(end == first){
                end = processHandler;
            }
        }
    
        @Override
        public void addEnd(AbstractLinkedProcessHandler processHandler) {
    
            end.setNext(processHandler);
            end = processHandler;
    
        }
    
        //责任链调用逻辑入口
        @Override
        public void entry(String req, String resp) {
            first.entry(req, resp);//指向AbstractLinkedProcessHandler的实现
        }
    }
    
    
    1. 写测试类
    public class ChainTest {
        public static void main(String[] args) {
            ProcessHandlerChain chain = new DefaultProcessHandlerChain();
            
            //责任链顺序先刷牙再洗脸最后睡觉
            chain.addEnd(new BrushTeeth());
            chain.addEnd(new WashFace());
            chain.addEnd(new Sleep());
    
            chain.entry("request","response");
        }
    }
    
    1. 测试结果如下
    刷牙
    洗脸
    睡觉
    
    Process finished with exit code 0
    

    好了,责任链模式暂时就先介绍到这里了,有问题欢迎在评论区留言呐。

  • 相关阅读:
    centos7系统初始化
    瀑布流无限加载infinitescroll插件与masonry插件使用
    网页前端导出CSV,Excel格式文件
    js添加收藏夹
    Fiddler修改http请求响应简单实例
    Nodejs的Gruntjs使用一则
    Jquery插件validate使用一则
    PostgreSQL操作-psql基本命令
    SSH连接时出现Host key verification failed的原因及解决方法以及ssh-keygen命令的用法
    在ubuntu20.04上设置python2为默认方式
  • 原文地址:https://www.cnblogs.com/cathyqq/p/14459857.html
Copyright © 2011-2022 走看看