一、概述

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

二、主要角色

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

三、实现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 numpy高效体现

    import numpy as np import time def python_sum(n): a=[i**2 for i in range(n)] b=[i**3 for i in range( ...

  2. vue-qiankun公司微前端项稳定目落地后的总结(附github仓库demo,将会持续更新)

    ️本文为博客园社区首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农‍♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gi ...

  3. 手把手0基础Centos下安装与部署paddleOcr 教程

    !!!以下内容为作者原创,首发于个人博客园&掘金平台.未经原作者同意与许可,任何人.任何组织不得以任何形式转载.原创不易,如果对您的问题提供了些许帮助,希望得到您的点赞支持. 0.paddle ...

  4. MapReduce处理简单数据

    首先要说明的是,关于老师给的实验要求,我在网上看到了原文,原文地址:https://blog.csdn.net/qq_41035588/article/details/90514824,有兴趣的同学可 ...

  5. 【012】JavaSE面试题(十二):多线程(2)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [012] - JavaSE面试题(十二):多线程(2) 第1问:多线程的创建方式? 方式一:继承 ...

  6. Pandas高级教程之:自定义选项

    目录 简介 常用选项 get/set 选项 经常使用的选项 最大展示行数 超出数据展示 最大列的宽度 显示精度 零转换的门槛 列头的对齐方向 简介 pandas有一个option系统可以控制panda ...

  7. 微信小程序云开发-数据库和云函数的应用-点赞/收藏/评论功能

    一.准备工作 1.创建数据库表articles,字段分别为: 序号 字段名称 字段类型 字段值 字段描述 备注说明 1 title string "标题1" 文章标题   2 de ...

  8. 微信小程序云开发-数据库-用户更新数据并提交

    一.wxml增加input输入框和[更新商品价格]按钮 在商品详情页新增[更新商品价格]按钮,wxml新增部分代码,input绑定事件,用于获取用户输入的内容.按钮绑定事件,用于更新商品价格.  二. ...

  9. powerdesigner连接postgresql数据库生成pdm及word文档

    1.准备软件: powerdesigner165与postgresql的驱动:psqlodbc_11_01_0000 2.安装并破解完成powerdesigner165 参看链接:https://ww ...

  10. Find-set-root-ignore-floppies-ignore-cd /bootmgr 解决办法(用win 7安装盘)

    出现标题此种现象,一般是mgr引导程序丢失有关,现在排除bootloader 选择是硬盘引导, 然后修改为cd盘引导,并重启,在win7安装程序启动后,选择修复系统. 打开相应的commnd,并执行如 ...