C++ - Pipe/Filter模式

本文介绍了管道/过滤器模式的概念及应用,通过ASP.NET请求管道为例,详细解释了该模式如何帮助处理数据流。并提供了商品筛选的具体实现案例。
设计模式 - C++ - Pipe/Filter模式
1. 管道/过滤器模式的现实意义
    Chris说:不多说,直接上图,看不明白的话,多吃点鱼肝油补补脑:)
2. 管道/过滤器模式的抽象模型

   管道和过滤器(Pipes and Filters)体系架构模式是为处理数据流的系统提供的一种模式。它是由过滤器和管道组成的。每个处理步骤都被封装在一个过滤器组件中,数据通过相邻过滤器之间的管道进行传输。每个过滤器可以单独修改,功能单一,并且它们之间的顺序可以进行配置。

3. 管道/过滤器模式的实际案例
3.1. ASP.NET请求管道

 

管道过滤器(Pipe-And-Filter)模式

按照《POSA(面向模式的软件架构)》里的说法,管道过滤器(Pipe-And-Filter)应该属于架构模式,因为它通常决定了一个系统的基本架构。管道过滤器和生产流水线类似,在生产流水线上,原材料在流水线上经一道一道的工序,最后形成某种有用的产品。在管道过滤器中,数据经过一个一个的过滤器,最后得到需要的数据。

clip_image001
  如果感觉抽象的话大家可以想想网上购物。在网上购物的时候一般都会用到搜索和过滤功能。多数网店不仅支持一次性过滤,而且还可以支持在过滤到的结果中层层过滤直至到找到你所钟爱的商品。本文就提出一种简化的实现。由于考虑到过滤器不仅可能是单一条件的,也可能是多个条件的组合。所以就通过Composite Pattern引入了Composite Filter以支持And、Or以及Not等组合条件过滤。类结构图如下:
clip_image003
代码实现如下:
namespace FilterDemo
{
         public enum CATAGORY { Food, Drink, Cloth, Office, Other };

         public class Goods
        {
                 public int Price { private set; get; }
                 public CATAGORY Category { private set; get; }
                 public Goods(CATAGORY category, int price)
                {
                        Category = category;
                        Price = price;
                }
        }

         public interface Filter
        {
                 bool Match(Goods goods);
        }

         public class PriceRangeFilter : Filter
        {
                 int min;
                 int max;
                 public PriceRangeFilter( int min, int max)
                {
                         this.min = min;
                         this.max = max;
                }
                 public bool Match(Goods goods)
                {
                         return (goods.Price >= min && goods.Price <= max);
                }
        }

         public class CategoryFilter : Filter
        {
                CATAGORY category;
                 public CategoryFilter(CATAGORY category)
                {
                         this.category = category;
                }
                 public bool Match(Goods goods)
                {
                         return (goods.Category == category);
                }
        }

         public class CompositeFilter : Filter
        {
                 protected ArrayList filters = new ArrayList();
                 public void AddFilters( params Filter[] filters)
                {
                         this.filters.AddRange(filters);
                }
                 public void AddFilter(Filter filter)
                {
                         this.filters.Add(filter);
                }
                 public bool Match(Goods goods)
                {
                         return false;
                }
        }

         public class AddFilter : CompositeFilter
        {
                 public bool Match(Goods goods)
                {
                         foreach (Filter filter in filters)
                        {
                                 if (!filter.Match(goods))
                                         return false;
                        }
                         return true;
                }
        }

         public class OrFilter : CompositeFilter
        {
                 public bool Match(Goods goods)
                {
                         foreach(Filter filter in filters)
                        {
                                 if(filter.Match(goods))
                                         return true;
                        }
                         return false;
                }
        }
}

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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值