简单举例如下:
会员搜索过滤模块,要先按姓名搜索,再按编号过滤部分会员.
例子比较简单,按姓名搜索,过滤会员在.两功能上是独立的.
没有依赖性,不过实际中常用来功能有依赖性解决并行开发的.
例子中简单只有一个数据源.实际中常常是用来处理两个数据源.
第一个是作为输入的,第二个则是作为输出的.
谁有更好的理解和应用?
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace ModeStudy.Pipes_and_Filters
{
//可用的流动处理数据接口
public interface IEnableStreamingProcessData<DataSource>
{
//例子简单只有一个数据源.
//实际中常常会是两个数据源.第一个作为,第二个作为输出.
//记得Java中的过滤器吗?
//public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
//void Process(DataSourceInput dataInput,out DataSourceOutput dataOutput)
void Process(ref DataSource dataSource);
}
//链条式处理类
public class ProcessChain<DataSource> where DataSource : new()
{
private LinkedList<IEnableStreamingProcessData<DataSource>> _links = new LinkedList<IEnableStreamingProcessData<DataSource>>();
public void AddLink(LinkedListNode<IEnableStreamingProcessData<DataSource>> link)
{
_links.AddLast(link);
}
public void Process(ref DataSource dataSource)
{
foreach (IEnableStreamingProcessData<DataSource> element in _links)
{
element.Process(ref dataSource);
}
}
}
//搜索会员类
public class MembersSearch : IEnableStreamingProcessData<DataTable>
{
private string _searchName;
public string SearchName
{
get { return _searchName; }
set { _searchName = value; }
}
public MembersSearch()
{
this.Reset();
}
public void Reset()
{
_searchName = string.Empty;
}
#region IEnableStreamingProcessData<DataTable> 成员
public void Process(ref DataTable dataSource)
{
dataSource.DefaultView.RowFilter = "name like '%" + this.SearchName+"%'";
dataSource = dataSource.DefaultView.ToTable();
}
#endregion
}
//会员过滤类
public class MembersFilter : IEnableStreamingProcessData<DataTable>
{
private int _id;
public int FilterID
{
get { return _id; }
set { _id = value; }
}
public MembersFilter()
{
this.Reset();
}
public void Reset()
{
_id = -1;
}
#region IEnableStreamingProcessData<DataTable> 成员
public void Process(ref DataTable dataSource)
{
dataSource.DefaultView.RowFilter = "id <>" + this.FilterID.ToString();
dataSource = dataSource.DefaultView.ToTable();
}
#endregion
}
//会员搜索单例工厂
public static class MemberSearchFactory
{
private static MembersSearch memSearch;
private static MembersFilter memFilter;
public static IEnableStreamingProcessData<DataTable> MemberSearchInstance(string searchName)
{
if (null == memSearch)
memSearch = new MembersSearch();
memSearch.Reset();
memSearch.SearchName = searchName;
return memSearch;
}
public static IEnableStreamingProcessData<DataTable> MemberFilterInstance(int filterID)
{
if (null == memFilter)
memFilter = new MembersFilter();
memFilter.Reset();
memFilter.FilterID = filterID;
return memFilter;
}
}
public class Test
{
public void Process()
{
//构造一个具有 id, name列的DataTable.,并添加三条数据.
DataTable table = new DataTable();
DataColumnCollection columns = table.Columns;
columns.Add(new DataColumn("id",typeof(int)));
columns.Add(new DataColumn("name",typeof(string)));
DataRow row = table.NewRow();
row["id"]=1;
row["name"]="tyweber";
table.Rows.Add(row);
row = table.NewRow();
row["id"] = 2;
row["name"] = "admin";
table.Rows.Add(row);
row = table.NewRow();
row["id"] = 3;
row["name"] = "tyweber_zouyong";
table.Rows.Add(row);
//实例化链条处理类,进行筛选DataTable中的数据.
ProcessChain<DataTable> chain = new ProcessChain<DataTable>();
IEnableStreamingProcessData<DataTable> memSearch = MemberSearchFactory.MemberSearchInstance("tyweber");
IEnableStreamingProcessData<DataTable> memFilter = MemberSearchFactory.MemberFilterInstance(1);
LinkedListNode<IEnableStreamingProcessData<DataTable>> nodeSearch = new LinkedListNode<IEnableStreamingProcessData<DataTable>>(
memSearch
);
LinkedListNode<IEnableStreamingProcessData<DataTable>> nodeFilter = new LinkedListNode<IEnableStreamingProcessData<DataTable>>(
memFilter
);
chain.AddLink(nodeSearch);
chain.AddLink(nodeFilter);
chain.Process(ref table);
foreach (DataRow r in table.Rows)
{
Console.WriteLine(r["name"]);
}
}
}
}