一、概述

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

二、主要角色

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

三、实现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. C语言:位运算符

    异或        ^     两个二进制位相同结果为0:不相同结果为1              1^1=0    1^0=1   0^1=1  0^0=1 按位或    |      两个二进制位 ...

  2. PYTHON 使用re.findall如果没有引用

    python使用re.findall时必须提前import re否则不提示错误,只是找不到结果 import re ab=re.findall('cmp=com.(.*?)/',aa)

  3. vue 快速入门 系列 —— vue loader 扩展

    其他章节请看: vue 快速入门 系列 vue loader 扩展 在vue loader一文中,我们学会了从零搭建一个简单的,用于单文件组件开发的脚手架.本篇将在此基础上继续引入一些常用的库:vue ...

  4. MySql存储过程的创建与使用及在thinkphp中如何调用笔记

    学习sql的存储过程,笔记总结如下: MySQL默认将分号,即";"作为语句的分隔符.如果是这样的话,则一个存储过程将很难正常创建,因为它的BEGIN和END之间可以是任意数量的S ...

  5. protobuf基础类以及python 转换pb2.py文件

    一 protobuf-前端解析js 前端解析思路: 1.问后端要数据模型文件,比如名为MODEL.proto 2.使用谷歌官方的工具生成MODEL.js 3.把项目中引用的MODEL.js 和谷歌官方 ...

  6. 【秒懂音视频开发】26_RTMP服务器搭建

    从本节开始,正式开启流媒体相关的内容. 流媒体 基本概念 流媒体(Streaming media),也叫做:流式媒体. 是指将一连串的多媒体数据压缩后,经过互联网分段发送数据,在互联网上即时传输影音以 ...

  7. Python3中datetime时区转换介绍与踩坑

    最近的项目需要根据用户所属时区制定一些特定策略,学习.应用了若干python3的时区转换相关知识,这里整理一部分记录下来. 下面涉及的几个概念及知识点: GMT时间:Greenwich Mean Ti ...

  8. Elasticsearch(9300、9200)未授权访问

    下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.zip 检测 http://localhost ...

  9. XSS靶机1

    参考文章https://blog.csdn.net/weixin_30897079/article/details/97314476 第一关 http://www.zixem.altervista.o ...

  10. 记一次针对excel导出的优化

    最近发现我们系统导出excel文件时由于是导出百万级数据导出,速度过慢并且内存占用多,故进行了下面的一次优化. 我们使用apache的poi进行excel文件操作 主要耗时: 1.从数据库得到需要导出 ...