自動配線されるフィルターのリストを持つことは、問題を解決するためのあまり良い方法ではありません。すべてのフィルターは、メソッドに渡す必要があるさまざまなタイプのパラメーターに依存しますdoFilter
。そうする必要があると、このアプローチは非常に柔軟性がなくなります。はい、可変引数を使用できますが、混乱を招くだけです。そのため、製品のコレクションに適用されるフィルターのチェーンを構築するビルダーを実装する方がおそらく簡単です。ビルダーに新しいフィルターを追加するのは簡単な作業になります。Builder パターンは、さまざまなパラメーターが多数使用されている場合に非常に役立ちます。
このインターフェースを持つことを検討してください:
public interface CollectionFilter<T> {
public Collection<T> doFilter(Collection<T> collection);
}
すべてのフィルターをコレクションに適用するフィルター チェーン クラス:
public class CollectionFilterChain<T> {
private final List<CollectionFilter<T>> filters;
public CollectionFilterChain(List<CollectionFilter<T>> filters) {
this.filters = filters;
}
public Collection<T> doFilter(Collection<T> collection) {
for (CollectionFilter<T> filter : filters) {
collection = filter.doFilter(collection);
}
return collection;
}
}
2 つのCollectionFilter<T>
実装:
public class InStockFilter<T> implements CollectionFilter<T> {
public Collection<T> doFilter(Collection<T> collection) {
// filter
}
}
public class MinPriceFilter<T> implements CollectionFilter<T> {
private final float minPrice;
public MinPriceFilter(float minPrice) {
this.minPrice = minPrice;
}
public Collection<T> doFilter(Collection<T> collection) {
// filter
}
}
そして、フィルタ チェーンを簡単な方法で構築できるようにするビルダー:
public class CollectionFilterChainBuilder<T> {
List<CollectionFilter<T>> filters;
public CollectionFilterChainBuilder() {
filters = new ArrayList<CollectionFilter<T>>();
}
public CollectionFilterChainBuilder<T> inStock() {
filters.add(new InStockFilter<T>());
return this;
}
public CollectionFilterChainBuilder<T> minPrice(float price) {
filters.add(new MinPriceFilter<T>(price));
return this;
}
public CollectionFilterChain<T> build() {
return new CollectionFilterChain<T>(filters);
}
}
ビルダーを使用すると、次のようにフィルター チェーンを簡単に作成できます。
CollectionFilterChainBuilder<Product> builder =
new CollectionFilterChainBuilder();
CollectionFilterChain<Product> filterChain =
builder.inStock().minPrice(2.0f).build();
Collection<Product> filteredProducts =
filterChain.doFilter(products);
より動的な設定では、次のようなビルダーを使用できます。
CollectionFilterChainBuilder<Product> builder = new CollectionFilterChainBuilder();
if (filterInStock) {
builder.inStock();
}
if (filterMinPrice) {
builder.minPrice(minPrice);
}
// build some more