按照《POSA(面向模式的软件架构)》里的说法,管道过滤器(Pipe-And-Filter)应该属于架构模式,因为它通常决定了一个系统的基本架构。管道过滤器和生产流水线类似,在生产流水线上,原材料在流水线上经一道一道的工序,最后形成某种有用的产品。在管道过滤器中,数据经过一个一个的过滤器,最后得到需要的数据。
管道过滤器(Pipe-And-Filter)模式
  如果感觉抽象的话大家可以想想网上购物。在网上购物的时候一般都会用到搜索和过滤功能。多数网店不仅支持一次性过滤,而且还可以支持在过滤到的结果中层层过滤直至到找到你所钟爱的商品。本文就提出一种简化的实现。由于考虑到过滤器不仅可能是单一条件的,也可能是多个条件的组合。所以就通过Composite Pattern引入了Composite Filter以支持And、Or以及Not等组合条件过滤。类结构图如下:
管道过滤器(Pipe-And-Filter)模式
代码实现如下:
管道过滤器(Pipe-And-Filter)模式namespace FilterDemo
管道过滤器(Pipe-And-Filter)模式{
管道过滤器(Pipe-And-Filter)模式        public enum CATAGORY { Food, Drink, Cloth, Office, Other };

管道过滤器(Pipe-And-Filter)模式        public class Goods
管道过滤器(Pipe-And-Filter)模式        {
管道过滤器(Pipe-And-Filter)模式                public int Price { private set; get; }
管道过滤器(Pipe-And-Filter)模式                public CATAGORY Category { private set; get; }
管道过滤器(Pipe-And-Filter)模式                public Goods(CATAGORY category, int price)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        Category = category;
管道过滤器(Pipe-And-Filter)模式                        Price = price;
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式        }

管道过滤器(Pipe-And-Filter)模式        public interface Filter
管道过滤器(Pipe-And-Filter)模式        {
管道过滤器(Pipe-And-Filter)模式                bool Match(Goods goods);
管道过滤器(Pipe-And-Filter)模式        }

管道过滤器(Pipe-And-Filter)模式        public class PriceRangeFilter : Filter
管道过滤器(Pipe-And-Filter)模式        {
管道过滤器(Pipe-And-Filter)模式                int min;
管道过滤器(Pipe-And-Filter)模式                int max;
管道过滤器(Pipe-And-Filter)模式                public PriceRangeFilter(int min, int max)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        this.min = min;
管道过滤器(Pipe-And-Filter)模式                        this.max = max;
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式                public bool Match(Goods goods)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        return (goods.Price >= min && goods.Price <= max);
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式        }

管道过滤器(Pipe-And-Filter)模式        public class CategoryFilter : Filter
管道过滤器(Pipe-And-Filter)模式        {
管道过滤器(Pipe-And-Filter)模式                CATAGORY category;
管道过滤器(Pipe-And-Filter)模式                public CategoryFilter(CATAGORY category)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        this.category = category;
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式                public bool Match(Goods goods)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        return (goods.Category == category);
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式        }

管道过滤器(Pipe-And-Filter)模式        public class CompositeFilter : Filter
管道过滤器(Pipe-And-Filter)模式        {
管道过滤器(Pipe-And-Filter)模式                protected ArrayList filters = new ArrayList();
管道过滤器(Pipe-And-Filter)模式                public void AddFilters( params Filter[] filters)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        this.filters.AddRange(filters);
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式                public void AddFilter(Filter filter)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        this.filters.Add(filter);
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式                public bool Match(Goods goods)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        return false;
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式        }

管道过滤器(Pipe-And-Filter)模式        public class AddFilter : CompositeFilter
管道过滤器(Pipe-And-Filter)模式        {
管道过滤器(Pipe-And-Filter)模式                public bool Match(Goods goods)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        foreach (Filter filter in filters)
管道过滤器(Pipe-And-Filter)模式                        {
管道过滤器(Pipe-And-Filter)模式                                if (!filter.Match(goods))
管道过滤器(Pipe-And-Filter)模式                                        return false;
管道过滤器(Pipe-And-Filter)模式                        }
管道过滤器(Pipe-And-Filter)模式                        return true;
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式        }

管道过滤器(Pipe-And-Filter)模式        public class OrFilter : CompositeFilter
管道过滤器(Pipe-And-Filter)模式        {
管道过滤器(Pipe-And-Filter)模式                public bool Match(Goods goods)
管道过滤器(Pipe-And-Filter)模式                {
管道过滤器(Pipe-And-Filter)模式                        foreach(Filter filter in filters)
管道过滤器(Pipe-And-Filter)模式                        {
管道过滤器(Pipe-And-Filter)模式                                if(filter.Match(goods))
管道过滤器(Pipe-And-Filter)模式                                        return true;
管道过滤器(Pipe-And-Filter)模式                        }
管道过滤器(Pipe-And-Filter)模式                        return false;
管道过滤器(Pipe-And-Filter)模式                }
管道过滤器(Pipe-And-Filter)模式        }
管道过滤器(Pipe-And-Filter)模式}

  至此,Pipe-And-Filter模式的Filter部分设计已经完成。剩下的就是设计管道,并安装上述各种Filter。