管道模式

本文介绍了Tomcat服务器采用的管道模式原理及实现方式。管道模式通过将处理过程划分为独立的模块(阀门),增强了系统的可扩展性和重用性。文章详细讲解了阀门接口、管道接口等关键组件的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

学习了tomcat,对其中各个组件加载的顺序有一定的了解。Tomcat是根据管道模式来设计加载器的。为什么要使用管道模式?在一个大型的系统中,如果要对一个复杂的处理逻辑进行修改的话则是牵一发动全身,使得整个系统看起来没有可扩展性和重用性。
一种解决方法是将整个流程处理进行详细的划分,划分出来的小模块相互独立并且各自处理一段逻辑,这些逻辑的输出作为下一个逻辑的输入,这样一来只要针对摸个模块进行功能上的修改就可以了。这样的模式成为管道模式,也是tomcat上使用的模式。

何为管道模式

顾名思义,管道模式就是用一条管道将多个对象连接起来,管道与管道之间用阀门连接起来,而处理的逻辑也是在阀门上。待处理的对象进入管道后,首先经过阀门一,阀门二最后到基础阀门(basic value)。阀门的执行顺序为添加顺序,因为阀门的数据结构是list,先进先出。
管道描述

管道的调用方法

管道的调用方法是通过Value接口来定义阀门的调用。由于阀门之间是通过List来连接所以一个阀门到另一个阀门需要通过next方法来调用下一个阀门;而Pipeline接口定义了操作阀门的方法,包括获取第一个阀门、添加删除阀门、获取基础阀门等。
阀与管道的描述

管道模式举例

  • 阀门接口
public interface Value{
    public Value getNext();
    public void setNext(Value value);
    public void invoke(String string);
}
  • 管道接口
public interface Pipeline{
    public Value getFirst();
    public Value getBasic();
    public void setBasic(Valve valve);
    public void addValve(Valve valve);
}
  • 基础阀门
    将传入的字符串中的“aa”转化成”bb”
public class BasicValue implements Value{
    protected Value next = null;
    public Value getNext(){
        return next;
    }

    public void invoke(String handing){
        handing  = handing.replaceAll("aa","bb");
        System.out.println("基础阀门处理完后:"+handing);
    }
    public void setNext(Value value){
        this.next = value;
    }

}
  • 第二个阀门,将传入的字符串中的”11”转换成”22”
public class SecondValve implements Valve {
    protected Valve next = null; 
    public Valve getNext() {
        return next;
    }
    public void invoke(String handling) {
        handling = handling.replaceAll("11", "22");
        System.out.println("Second阀门处理完后:" + handling);
        getNext().invoke(handling);
    }
    public void setNext(Valve valve) {
        this.next = valve;
    }
}
  • 第三个阀门
    将传入的字符串中”zz”替换成”yy”
public class ThirdValve implements Valve {
    protected Valve next = null; 
    public Valve getNext() {
        return next;
    }
    public void invoke(String handling) {
        handling = handling.replaceAll("zz", "yy");
        System.out.println("Third阀门处理完后:" + handling);
        getNext().invoke(handling);
    }
    public void setNext(Valve valve) {
        this.next = valve;
    }
}
  • 管道
    根据默认规定,首先向管道中添加基础阀,再按顺序添加其他阀;阀门的执行顺序为先进先出,基础法最后执行
public class StandardPipeline implements Pipeline {
    protected Valve first = null; 
    protected Valve basic = null; 
    public void addValve(Valve valve) {
        if (first == null) {
            first = valve;
            valve.setNext(basic);
        } else {
            Valve current = first;
            while (current != null) {
                if (current.getNext() == basic) {
                    current.setNext(valve);
                    valve.setNext(basic);
                    break;
                }
                current = current.getNext();
            }
        }
    }
    public Valve getBasic() {
        return basic;
    }
    public Valve getFirst() {
        return first;
    }
    public void setBasic(Valve valve) {
        this.basic = valve;
    }
}
  • 测试类
public class Main {
    public static void main(String[] args) {
        String handling="aabb1122zzyy";
        StandardPipeline pipeline = new StandardPipeline();
        BasicValve basicValve = new BasicValve();
        SecondValve secondValve = new SecondValve();
        ThirdValve thirdValve = new ThirdValve();
        pipeline.setBasic(basicValve);
        pipeline.addValve(secondValve);
        pipeline.addValve(thirdValve);
        pipeline.getFirst().invoke(handling);
    }
}

测试结果:
Second阀门处理完后:aabb2222zzyy
Third阀门处理完后:aabb2222yyyy
基础阀门处理完后:bbbb2222yyyy
这就是管道模式,在管道中连接一个或多个阀门,每个阀门负责一部分逻辑处理,数据按规定的顺序往下流。此模式分解了逻辑处理任务,可方便对某任务单元进行安装拆卸,提高了流程的可扩展性、可重用性、机动性、灵活性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值