按照《POSA(面向模式的軟件架構)》裏的說法,管道過濾器(Pipe-And-Filter)應該屬於架構模式,因爲它通常決定了一個系統的基本架構。管道過濾器和生產流水線類似,在生產流水線上,原材料在流水線上經一道一道的工序,最後形成某種有用的產品。在管道過濾器中,數據經過一個一個的過濾器,最後得到需要的數據。
代碼實現如下:
namespace FilterDemo
{
public enum CATAGORY { Food, Drink, Cloth, Office, Other };
{
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 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);
}
}
{
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);
}
}
{
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;
}
}
{
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 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;
}
}
}
{
public bool Match(Goods goods)
{
foreach(Filter filter in filters)
{
if(filter.Match(goods))
return true;
}
return false;
}
}
}
至此,Pipe-And-Filter模式的Filter部分設計已經完成。剩下的就是設計管道,並安裝上述各種Filter