• 售前

  • 售后

热门帖子
入门百科

tomcat管道模式 pipeline与valve详解

[复制链接]
尹恩沛 显示全部楼层 发表于 2021-10-26 14:13:04 |阅读模式 打印 上一主题 下一主题
媒介
在一个比力复杂的大型体系中,假如存在某个对象或数据流需要被举行繁杂的逻辑处理的话,我们可以选择在一个大的组件中举行这些繁杂的逻辑处理,这种方式确实到达了目标,但却是简朴粗暴的。大概在某些环境这种简朴粗暴的方式将带来一些麻烦,例如我要改动此中某部门处理逻辑、我要添加一些处理逻辑到流程、我要在流程中淘汰一些处理逻辑时,这里有些看似简朴的改动都让我们无从动手,除了对整个组件举行改动。整个体系看起来没有任何可扩展性和可重用性。

是否有一种模式可以将整个处理流程举行详细分别,分别出的每个小模块相互独立且各自负责一段逻辑处理,这些逻辑处理小模块根据顺序连起来,前以模块的输出作为后一模块的输入,最后一个模块的输出为终极的处理结果。云云一来修改逻辑时只针对某个模块修改,添加或淘汰处理逻辑也可细化到某个模块颗粒度,而且每个模块可重复利用,可重用性大大增强。这种模式就是此章节要举行讨论的管道模式。

顾名思义,管道模式就像一条管道把多个对象连接起来,团体看起来就像多少个阀门嵌套在管道中,而处理逻辑就放在阀门上,如下图,需要处理的对象进入管道后,分别经过阀门一、阀门二、阀门三、阀门四,每个阀门都会对进入的对象举行一些逻辑处理,经过一层层的处理后从管道尾处理,此时的对象就是已完成处理的目标对象。


既然管道模式这么有效,我们希望能在步伐中得本地思量利用,为了实现此模式需要多个对象协作,可参考如下类图,Valve接口界说了阀门的调用方法,由于阀门与阀门利用单链表结构连接所以需提供对next的操作,实现一个阀门对其举行扩展即可;Pipeline接口界说了管道操作阀门的方法,包罗获取第一个阀门、获取基础阀门、添加阀门等方法,管道需对其扩展。



往下看怎样简朴实现一个管道模式:

① 阀门接口
  1. public interface Valve {
  2. public Valve getNext();
  3. public void setNext(Valve valve);
  4. public void invoke(String handling);
  5. }
复制代码
② 管道接口
  1. public interface Pipeline {
  2. public Valve getFirst();
  3. public Valve getBasic();
  4. public void setBasic(Valve valve);
  5. public void addValve(Valve valve);
  6. }
复制代码
③ 基础阀门,处理逻辑仅仅是简朴的将传入的字符串中”aa”更换成”bb”
  1. public class BasicValve implements Valve {
  2. protected Valve next = null;
  3. public Valve getNext() {
  4. return next;
  5. }
  6. public void invoke(String handling) {
  7.     handling=handling.replaceAll("aa", "bb");
  8. System.out.println("基础阀门处理完后:" + handling);
  9. }
  10. public void setNext(Valve valve) {
  11. this.next = valve;
  12. }
  13. }
复制代码
④ 第二个阀门,将传入的字符串中”11”更换成”22”
  1. public class SecondValve implements Valve {
  2. protected Valve next = null;
  3. public Valve getNext() {
  4. return next;
  5. }
  6. public void invoke(String handling) {
  7. handling = handling.replaceAll("11", "22");
  8. System.out.println("Second阀门处理完后:" + handling);
  9. getNext().invoke(handling);
  10. }
  11. public void setNext(Valve valve) {
  12. this.next = valve;
  13. }
  14. }
复制代码
⑤ 第三个阀门,将传入的字符串中”zz”更换成”yy”
  1. public class ThirdValve implements Valve {
  2. protected Valve next = null;
  3. public Valve getNext() {
  4. return next;
  5. }
  6. public void invoke(String handling) {
  7. handling = handling.replaceAll("zz", "yy");
  8. System.out.println("Third阀门处理完后:" + handling);
  9. getNext().invoke(handling);
  10. }
  11. public void setNext(Valve valve) {
  12. this.next = valve;
  13. }
  14. }
复制代码
⑥ 管道,我们一般的操作是先通过setBasic设置基础阀门,接着按顺序添加其他阀门,执行时的顺序是:先添加进来的先执行,最后才执行基础阀门。
  1. public class StandardPipeline implements Pipeline {
  2. protected Valve first = null;
  3. protected Valve basic = null;
  4. public void addValve(Valve valve) {
  5. if (first == null) {
  6. first = valve;
  7. valve.setNext(basic);
  8. } else {
  9. Valve current = first;
  10. while (current != null) {
  11. if (current.getNext() == basic) {
  12. current.setNext(valve);
  13. valve.setNext(basic);
  14. break;
  15. }
  16. current = current.getNext();
  17. }
  18. }
  19. }
  20. public Valve getBasic() {
  21. return basic;
  22. }
  23. public Valve getFirst() {
  24. return first;
  25. }
  26. public void setBasic(Valve valve) {
  27. this.basic = valve;
  28. }
  29. }
复制代码
⑦ 测试类
  1. public class Main {
  2. public static void main(String[] args) {
  3. String handling="aabb1122zzyy";
  4. StandardPipeline pipeline = new StandardPipeline();
  5. BasicValve basicValve = new BasicValve();
  6. SecondValve secondValve = new SecondValve();
  7. ThirdValve thirdValve = new ThirdValve();
  8. pipeline.setBasic(basicValve);
  9. pipeline.addValve(secondValve);
  10. pipeline.addValve(thirdValve);
  11. pipeline.getFirst().invoke(handling);
  12. }
  13. }
复制代码
输出的结果如下:
  1. Second阀门处理完后:aabb2222zzyy
  2. Third阀门处理完后:aabb2222yyyy
  3. 基础阀门处理完后:bbbb2222yyyy
复制代码
这就是管道模式,在管道中连接一个或多个阀门,每个阀门负责一部门逻辑处理,数据按规定的顺序往下游。此模式分解了逻辑处理任务,可方便对某任务单位举行安装拆卸,提高了流程的可扩展性、可重用性、机动性、灵活性。

以上就是本文的全部内容,希望对各人的学习有所帮助,也希望各人多多支持草根技术分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作