设计模式与应用:责任链模式

本文介绍责任链模式的基本结构、应用场景、以及现有一些成熟框架的应用

简介

Chain of Responsibility(CoR)模式也叫职责链模式、责任链模式。是行为模式之一

责任链模式构造一系列分别担当不通的职责的类的对象来共同完成一个任务,他们像链条一样紧密相连,所以被称作职责链模式。

简单一点理解就是:工厂流水线工作

举例应用场景说明

  • 一场足球赛,A队的2个组成队a、b。a队踢上半场,踢完后交给b队踢下半场,一起完成这场球赛。
  • 吃一条鱼:妈妈吃鱼头,吃完让儿子吃鱼身体,吃完给爸爸吃鱼尾巴。
  • Servlet容器的过滤器

责任链就是这样有一条执行链来完成一件事。

职责和角色

  • Handler:处理类的抽象父类
  • concreteHandler:具体的处理类

设计使用责任链的基本流程

  1. 组织对象链:将某人物的所有职责执行对象以链的形式加以组织起来
  2. 消息或请求的传递:将消息或请求沿着对象链传递,让处于对象链中的对象得到处理机会
  3. 对象链中对象的职责分配:不同对象完成不同职责
  4. 任务的完成:对象链末尾的对象结束任务并停止消息或请求的继续传递。

结构图

这里写图片描述

实现

同样以造车的流水线为需求

这里写图片描述

处理器的抽象类

package com.mym.designmodel.CoRModel;

/**
 * 职责:Handler 职责类的抽象父类
 */
public abstract class AbstractCarHandler {

    AbstractCarHandler carHandler = null;

    public abstract void carHandler();

    public AbstractCarHandler setNextCarHandler(AbstractCarHandler nextCarHandler){
        this.carHandler = nextCarHandler;
        return this.carHandler;
    }

    /**职责下传*/
    protected void doChain(){
        if(this.carHandler != null){
            this.carHandler.carHandler();
        }
    }
}

责任链一个执行者1

package com.mym.designmodel.CoRModel;

/**
 * 职责:concreteHandler 具体的处理类
 */
public class CarHeadHandler extends AbstractCarHandler {
    @Override
    public void carHandler() {
        System.out.println("处理车的head!");

        //下传
        this.doChain();
    }
}

责任链一个执行者2

package com.mym.designmodel.CoRModel;

/**
 * 职责:concreteHandler 具体的处理类
 */
public class CarBodyHandler extends AbstractCarHandler {
    @Override
    public void carHandler() {
        System.out.println("处理车的body!");

        //下传
        this.doChain();
    }
}

责任链一个执行者3

package com.mym.designmodel.CoRModel;

/**
 * 职责:concreteHandler 具体的处理类
 */
public class CarTailHandler extends AbstractCarHandler {
    @Override
    public void carHandler() {
        System.out.println("处理车的tail!");

        //下传
        this.doChain();
    }
}

测试

测试相当于客户端client

package com.mym.designmodel.CoRModel;

/**
 * 测试
 */
public class MainClass {

    public static void main(String[] args) {
        AbstractCarHandler carheadHandle = new CarHeadHandler();
        AbstractCarHandler carbodyHandle = new CarBodyHandler();
        AbstractCarHandler carTailHandler = new CarTailHandler();

        //组装责任链
        carheadHandle.setNextCarHandler(carbodyHandle).setNextCarHandler(carTailHandler);

        //链头部开始执行
        carheadHandle.carHandler();
    }
}

执行结果:

处理车的head!
处理车的body!
处理车的tail!

责任链在于构造一个链式执行的流程,启动执行时只需要启动链的头部即可。

责任链的使用

笔者列举一些框架中比较典型的责任链处理

  • Restlet中的Finder路由。Restlet中的top类就是Restlet.class,中层的各个组件由Finder链接起来,一个请求的路由过程就是一个责任链的执行过程。
  • Servlet的filter
  • springMVC的拦截器
  • Netty中通道上的Handler也是责任链处理模式
    等等。。。

责任链模式常使用在对消息、请求的过滤上(预处理)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送,直到其中一个处理者能够处理它为止。以下是一个Java代码示例: 首先,我们需要定义一个处理器接口,该接口将由所有的具体处理器实现: ```java public interface Handler { void setNext(Handler handler); void handleRequest(Request request); } ``` 然后,我们可以定义一个具体的处理器类: ```java public class ConcreteHandler implements Handler { private Handler nextHandler; public void setNext(Handler handler) { this.nextHandler = handler; } public void handleRequest(Request request) { if (request.needsHandling()) { // 处理请求 } else { // 将请求传递给下一个处理器 nextHandler.handleRequest(request); } } } ``` 最后,我们可以创建一个请求类: ```java public class Request { private boolean needsHandling; public boolean needsHandling() { return needsHandling; } public void setNeedsHandling(boolean needsHandling) { this.needsHandling = needsHandling; } } ``` 现在,我们可以使用责任链模式来处理请求。首先,我们需要创建所有的处理器对象: ```java Handler handler1 = new ConcreteHandler(); Handler handler2 = new ConcreteHandler(); ``` 然后,我们需要将处理器对象链接在一起,以形成一个处理器链: ```java handler1.setNext(handler2); ``` 最后,我们可以使用处理器链来处理请求: ```java Request request = new Request(); request.setNeedsHandling(true); handler1.handleRequest(request); ``` 在这个例子中,我们将请求传递给第一个处理器。如果第一个处理器无法处理请求,它将把请求传递给第二个处理器。如果第二个处理器也无法处理请求,则请求不会被处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值