一、概述

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

二、主要角色

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

三、实现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语言查看多字节变量中每单个字节数据的方法代码: #include<stdio.h> void main() { int a=0x21109225;char* pAddress=(char ...

  2. 个人博客开发之blog-api 项目整合JWT实现token登录认证

    前言 现在前后端分离,基于session设计到跨越问题,而且session在多台服器之前同步问题,肯能会丢失,所以倾向于使用jwt作为token认证 json web token 导入java-jwt ...

  3. SFC style CSS variable injection

    摘要 在单文件组件样式中支持使用组件状态驱动的 CSS 变量( CSS 自定义属性). 基础示例 <template> <div class="text"> ...

  4. Blazor 事件处理开发指南

    翻译自 Waqas Anwar 2021年3月25日的文章 <A Developer's Guide To Blazor Event Handling> [1] 如果您正在开发交互式 We ...

  5. Cesium产品体系

    Cesium是国外Analytical Graphics, Inc.公司开发的一款基于JavaScript 的使用WebGL的地图引擎.Cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制 ...

  6. python通过sha1和base64生成签名

    一.python生成时间戳 # 案例 生成时间戳 import time t = time.time() print(t) # 原始时间数据 print(int(t)) # 秒级时间戳 print(i ...

  7. 第二十九篇 -- UDP和TCP

    最近在写WIFI模块,所以就想明确一些TCP和UDP的区别,发现以前的理解还是有点误区.现在重新学习. 相同点 UDP协议和TCP协议都是传输层协议 TCP(Transmission Control ...

  8. vue函数式组件详解

    本篇将详细介绍vue组件化之函数式组件,会用到以下api: Vue.component().Vue.extend().$createElement.patch(). 从事vue开发的小伙伴,平时组件化 ...

  9. homeless靶机

    仅供个人娱乐 靶机信息 下载地址:https://www.vulnhub.com/entry/homeless-1,215/ 一.主机扫描 二.信息收集 在网页源码和页面上,我们发现User-Agen ...

  10. SprintBoot简单入门

    1.什么是SpringBoot SpringBoot是基于Spring的基础上提供了一套全新的框架,其目的是为了在开发时简化Spring的相关配置及开发过程.在SpringBoot未出来之前,准备搭建 ...