一、概述

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

二、主要角色

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

三、实现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语言:随机数

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌.在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机 ...

  2. 解决clipboard.js在移动端复制失败的问题

    1.前沿 在项目中使用clipboard.js插件去实现点击按钮,复制一段网址到剪切板的功能.功能做好后,一开始无论这pc端还是移动端都能正常使用.突然某一天测出了一个bug:移动端复制失败,pc端是 ...

  3. python -- 模块与类库

    一.模块 模块(Module)是由一组类.函数和变量组成的,模块文件的扩展名是.py或.pyc 在使用模块之前,需要先使用import语句导入这个模块. 语法格式如下: import 模块名 from ...

  4. PAT乙级:1087 有多少不同的值 (20分)

    PAT乙级:1087 有多少不同的值 (20分) 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x ...

  5. node.js背后的引擎V8及优化技术

    本文将挖掘V8引擎在其它方面的代码优化,如何写出高性能的代码,及V8的性能诊断工具.V8是chrome背后的javascript引擎,因此本文的相关优化经验也适用于基于chrome浏览器的javasc ...

  6. [考试总结]noip模拟7

    为啥博客园 \(\LaTeX\) 老挂???! \(\huge{\text{菜}}\) 刚开始写 \(T1\) 的时候,在看到后缀前缀之后,直接想到 \(AC\) 自动机,在画了半个 \(trie\) ...

  7. winform制作简易屏幕保护工具

    效果如下: 具体实现代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  8. videojs文档翻译-api

    直播流地址 rtmp://live.hkstv.hk.lxdns.com/live/hks API 接口 (一)   Modules  模块 1)         browser :浏览器 2)    ...

  9. SAS 按自定义顺序对观测进行排序

    本文链接:https://www.cnblogs.com/snoopy1866/p/15091967.html 实际项目中会经常遇到按指定顺序输出Listing的情况,例如:输出所有受试者的分组情况列 ...

  10. SpringCloud升级之路2020.0.x版-3.Eureka Server 与 API 网关要考虑的问题

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 之前我们提到了 ...