一、概述

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

二、主要角色

  • 阀门 处理数据的节点
  • 管道 组织各个阀门
  • 客户端 构造管道,并调用

三、实现Demo

using System;
/// <summary>
///PipeLine模式的几个角色
///阀门 处理数据的节点
///管道 组织各个阀门
///客户端 构造管道,并调用
/// </summary>
namespace DesignMode_PileLine
{
//阀门接口
public interface IValve
{
IValve GetNext();
void SetNext(IValve v);
void Invoke(string s);
}
//管道接口
public interface IPipeLine
{
IValve GetFirst();
IValve GetBasic();
void SetBasic(IValve v);
void AddValve(IValve v);
}
/// <summary>
///尾阀门
/// </summary>
public class BasicValve:IValve
{
private IValve _nextValve;
public IValve GetNext()
{
return _nextValve;
}
public void SetNext(IValve v)
{
_nextValve = v;
}
public void Invoke(string s)
{
string org = s;
Console.WriteLine($"Basic valve invoked! Will replace a with b");
s = s.Replace('a', 'b');
Console.WriteLine($"Basic valved handled: {org} => {s}");
}
}
/// <summary>
/// 普通阀门
/// </summary>
///
public class FirstValve : IValve
{
private IValve _nextValve;
public IValve GetNext()
{
return _nextValve;
}
public void SetNext(IValve v)
{
_nextValve = v;
}
public void Invoke(string s)
{
string org = s;
Console.WriteLine($"First valve invoked! Will replace 1 with 2");
s = s.Replace('1', '2');
Console.WriteLine($"First valved handled: {org} => {s}"); GetNext()?.Invoke(s);//将数据传递到下一个阀门
}
}
public class SecondValve : IValve
{
private IValve _nextValve;
public IValve GetNext()
{
return _nextValve;
}
public void SetNext(IValve v)
{
_nextValve = v;
}
public void Invoke(string s)
{
string org = s;
Console.WriteLine($"Second valve invoked! Will replace 5 with 6");
s = s.Replace('5', '6');
Console.WriteLine($"Second valved handled: {org} => {s}"); GetNext()?.Invoke(s);//将数据传递到下一个阀门
}
} public class StandardPipeLine :IPipeLine
{ private IValve _firstValve;
private IValve _basicValve;
public IValve GetFirst()
{
return _firstValve;
}
public IValve GetBasic()
{
return _basicValve;
}
public void SetBasic(IValve v)
{
_basicValve = v;
}
public void AddValve(IValve v)
{
if(_firstValve == null)
{
_firstValve = v;
v.SetNext(_basicValve);
}
else
{
IValve current = _firstValve;
while(current != null)
{
if (current.GetNext() == _basicValve)
{
current.SetNext(v);
v.SetNext(_basicValve);
break;
}
current = current.GetNext();
}
}
}
} class Program
{
static void Main(string[] args)
{
string s = "1123wsa346yt4543s2156ac";
StandardPipeLine pipeLine = new StandardPipeLine();
BasicValve basicValve = new BasicValve();
FirstValve firstValve = new FirstValve();
SecondValve secondValve = new SecondValve();
pipeLine.SetBasic(basicValve);
pipeLine.AddValve(firstValve);
pipeLine.AddValve(secondValve);
pipeLine.GetFirst().Invoke(s); }
}
}

注:
阀门的实现分两种,即普通阀门和尾阀门。普通阀门在处理完自己的事情之后,必须调用GetNext.invoke(s)方法交给下一个阀门处理;而尾阀门不用调用这个方法,因为它是结束的那个阀门。

PipeLine实现类的主要逻辑在AddValve,它持有一个头阀门和一个尾阀门,它按照添加阀门顺序的方式构造阀门链表,按照队列的形式,先添加的先调用。

C#设计模式---PipeLine的更多相关文章

  1. Netty里的设计模式

    最近在撸 Netty 源码,发现了一些模式,顺手做个笔记. 分析版本是4.0 1. 构造器模式 ServerBootstrap 和 Bootstrap 的构建 2. 责任链设计模式 pipeline ...

  2. 服务器 : Apache Tomcat - 理解架构层次

    文章概览 相信很多接触java的人都对Tom猫有着多少的熟悉,就个人而言,本来只知道Tom简单的操作与配置,就像裹上一层纱,迷迷糊糊的. Tomcat的书籍本来就不多,高分的还是很久之前的版本,直到最 ...

  3. go语言设计模式之Concurrency pipeline

    pipeline.go package pipeline func LaunchPipeline(amount int) int { firstCh := generator(amount) seco ...

  4. pipeline(管道)设计模式

  5. Tomcat 系统架构与设计模式

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...

  6. Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析(转载)

    简介: 这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tomcat 的工作原理,第 2 部分将分析 Tomcat 中 ...

  7. Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

  8. Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析

    门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Applica ...

  9. Tomcat 系统架构与设计模式,第 1 部分: 工作原理

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

随机推荐

  1. python pycharm 正则表达式批量替换

    {accept:application/json, text/plain, */*,accept-encoding:gzip, deflate, br,accept-language:zh-CN,zh ...

  2. scrapy::Max retries exceeded with url

    运行scrapy时出错这个错误:Max retries exceeded with url解决方法: img1=requests.get(url=aa,headers=header1,timeout= ...

  3. Ajax爬取动态数据和HTTPS自动默认证书

    Ajax数据爬取 在spider爬取数据的过程中,有些网页的数据是利用Ajax动态加载出来的,所以,在网页源代码中可能不会看到这一部分的数据,因此,我们需要使用另外的方式进行数据多爬取. 以豆瓣电影的 ...

  4. 【LeetCode】28. 实现 strStr()

    28. 实现 strStr() 知识点:字符串:KMP算法 题目描述 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 ne ...

  5. Echarts入门踩坑记录

    关于Echarts,官网上,是这样介绍的,"Echarts,一个使用JavaScript实现的开源可视化库",也就是说,在使用过程中,将其作为普通的JavaScript组件库使用即 ...

  6. glibc库和glib库

    http://ftp.acc.umu.se/pub/GNOME/sources/ ubuntu16上glib的安装包的名是libglibXX  XX是版本号 ubuntu上查看glibc的方法 ldd ...

  7. request - cookie 操作(一)

    from urllib import request#headers 带cookieblog_url = "http://www.renren.com/452057374/profile?r ...

  8. Xshell、winscp连不上Linux虚拟机

    1.环境 本地机器WIN7环境,使用VMware Workstation Pro安装的CentOS7,系统镜像CentOS-6.1-x86_64-netinstall.iso 2.问题与分析 我的虚拟 ...

  9. 【洛谷P1318积水面积】最小生成树

    我写一篇绝对原创的题解,算法原创,求洛谷通过!!!(让更多人看到这篇题解) 绝大多数人肯定认为这道题是一道模拟题 以下为正解 我们来看一下这一道题,其实就是找到左右高点,在模拟. 但是这个是正常人的想 ...

  10. element UI table 状态显示:禁用-启用 上架-下架

    vue2.0+elementUI 解决表单上架下架状态的切换 https://blog.csdn.net/weixin_42507803/article/details/81910297 <el ...